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 相匹配。
使用 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 相匹配。