首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回经理的子用户以及存在的子经理的用户

返回经理的子用户以及存在的子经理的用户
EN

Stack Overflow用户
提问于 2016-02-04 08:50:06
回答 1查看 45关注 0票数 0

我正在执行一项任务,包括返回管理器的用户,如果存在子管理器,等等,只要存在子管理器或更多。

下面是该表的一个示例:

代码语言:javascript
复制
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,当我尝试将它融入到我的表中时,这对我来说是毫无意义的。

我写的最后一个查询是在这里(这根本不起作用,只是试着仔细考虑一下):

代码语言:javascript
复制
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  

期望产出:

代码语言:javascript
复制
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开始)及其所有用户以及任何可能的子管理器和子管理器?我们需要尽可能多的管理人员。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-04 11:37:08

正如注释中所述,您的查询几乎是很好的,您想要的输出应该通过查询来实现:

代码语言:javascript
复制
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 

对于双向链接的问题,为了避免无限循环,您可以添加新列,在其中存储整个路径并在每一行中检查它,以避免已经通过的路径。就像这样:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35196366

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档