我正在执行一项任务,包括返回管理器的用户,如果存在子管理器,等等,只要存在子管理器或更多。
下面是该表的一个示例:
ID ManagerID UserID
----- ----------- -----------
1 1 123
2 1 5
3 1 1234
4 1 12345
5 1 4
6 4 123456
7 4 1
8 5 13422
9 5 17262
10 5 87261
11 5 27362
12 5 28260
13 5 11123
14 5 91801
15 13422 77653我试着四处寻找可能的解决方案,比如CTE,当我尝试将它融入到我的表中时,这对我来说是毫无意义的。
我写的最后一个查询是在这里(这根本不起作用,只是试着仔细考虑一下):
WITH SubUsers AS
(
SELECT UserID from table WHERE ManagerID = 1
UNION ALL
SELECT u1.UserID FROM table u1
INNER JOIN SubUsers su on u1.ManagerID = su.UserID
)
SELECT * FROM SubUsers su 期望产出:
Manager UserID
1 123
1 5
1 1234
1 12345
1 4
5 13422
5 17262
5 87261
5 27362
5 28260
5 11123
5 91801
13422 77653
4 123456
4 1是否可以在表中运行并返回Manager (例如,从ManagerID =1开始)及其所有用户以及任何可能的子管理器和子管理器?我们需要尽可能多的管理人员。
发布于 2016-02-04 11:37:08
正如注释中所述,您的查询几乎是很好的,您想要的输出应该通过查询来实现:
WITH SubUsers AS
(
SELECT ManagerID, UserID FROM #table1 WHERE ManagerID = 1
UNION ALL
SELECT u1.ManagerID, u1.UserID FROM #table1 u1
INNER JOIN SubUsers su on u1.ManagerID = su.UserID
)
SELECT * FROM SubUsers su 对于双向链接的问题,为了避免无限循环,您可以添加新列,在其中存储整个路径并在每一行中检查它,以避免已经通过的路径。就像这样:
WITH SubUsers AS
(
SELECT ManagerID, UserID
, CAST(ManagerID AS NVARCHAR(MAX)) AS [Path]
FROM #table1 WHERE ManagerID = 1
UNION ALL
SELECT u1.ManagerID, u1.UserID
, Path + '->' + CAST(u1.ManagerID AS NVARCHAR(MAX))
FROM #table1 u1
INNER JOIN SubUsers su on u1.ManagerID = su.UserID
WHERE [Path] NOT LIKE '%' + u1.ManagerID +'->%'
)
SELECT * FROM SubUsers suhttps://stackoverflow.com/questions/35196366
复制相似问题