我正在处理一项任务,该任务涉及返回管理员的用户以及子管理员(如果他们存在等等),只要存在子管理员或更多。
这是表格的一个例子:
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
是否可以通过表运行并返回管理器(例如,以ManagerID = 1开头)及其所有用户以及任何可能的子管理器和子子管理器?要求尽可能多地管理经理。
答案 0 :(得分:0)
正如评论中所述,您的查询几乎没问题,您只需使用查询即可实现所需的输出:
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 su