SQL递归CTE返回的结果多于预期

时间:2016-04-22 06:15:27

标签: sql entity-framework recursion ef-code-first entity-framework-6

使用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。我承认我不知道它是如何运作的,但它没有给我我想要的结果。相反,它给了我这个:

enter image description here

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

1 个答案:

答案 0 :(得分:2)

重写如下:

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;

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

Demo