返回经理的子用户以及子经理'用户是否存在

时间:2016-02-04 08:50:07

标签: sql tsql parent-child

我正在处理一项任务,该任务涉及返回管理员的用户以及子管理员(如果他们存在等等),只要存在子管理员或更多。

这是表格的一个例子:

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开头)及其所有用户以及任何可能的子管理器和子子管理器?要求尽可能多地管理经理。

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