SQL 递归 CTE returns 结果比预期多

SQL recursive CTE returns more results than expected

使用 SQL 我正在尝试获取用户后代的 ID 列表。所以,假设我有:

Id | ManagerId | Name
---|-----------|------
4  | NULL      | James Smith
7  | 4         | John Doe (1)
8  | 7         | John Doe (2)
9  | 8         | John Doe (3)
10 | 8         | John Doe (4)

我想回去 4, 7, 8, 9, 10。在线查看推荐的方法是创建一个递归 CTE,我已经这样做了:

WITH UsersCTE AS (
    SELECT  Id,
            ManagerId
    FROM    Users
    WHERE   IsActive = 1
    UNION ALL
    SELECT  A.Id,
            UsersCTE.Id
    FROM    UsersCTE
            INNER JOIN Users AS A
                ON A.ManagerId = UsersCTE.ManagerId
)

SELECT  *
FROM    UsersCTE;

哪种作品。它首先获取我想要的 ID,然后开始以各种方式获取 ID。我承认我不知道它是如何工作的,但它没有给我想要的结果。相反,它给了我这个:

我怎样才能让它只给我我想要的 ID。作为参考,我需要获取此列表,以便我可以查询数据库并获取当前用户及其管理的任何后代的订单列表。我正在使用 EF6 进行数据访问,并计划将此 CTE 变成一个视图并适当地查询它,但我愿意接受更好的建议。

改写如下:

WITH UsersCTE AS (
    SELECT  Id,
            ManagerId
    FROM    Users
    WHERE   IsActive = 1 and ManagerID is null
    UNION ALL
    SELECT  A.Id,
            UsersCTE.Id
    FROM    UsersCTE
            INNER JOIN Users AS A
                ON A.ManagerId = UsersCTE.Id and A.IsActive = 1
)

SELECT  *
FROM    UsersCTE;

第一部分中的 null 过滤器锚定了您的 CTE,即为其提供了一个没有经理的员工的基本情况。另一个变化是第二部分的连接条件。更新后的条件将经理 ID 与员工 ID 相匹配。

Demo