我有一套表格,把一群人组织成一个团队。
表中没有父ID,因为用户可以在任意数量的团队中,并且团队可以有任意数量的主管。用户可能在六个团队中,但只监督其中两个团队,其中一个或两个被监督的团队中可能都有其他主管。所以我的层次结构看起来更像一个网络而不是一棵树。
我认识到递归查询可能会导致循环引用。假设软件目前正在处理这个问题。
公司的层次结构是由监督用户团队的主管、监督监督团队的经理等等描述的,所以它是分层的,但不是通常的方式。
我需要一个查询,在给定一个UserID的情况下,这个查询将返回他所监视的用户的ID,并且返回无限级别的ID。这样的查询会如何进行?
示例
Users (ID, Name)
1 Archie
2 Betty
3 Chuck
4 Dilton
5 Eddie
6 Fannie用户1是一个管理器(3级)。用户2和3是监督员(2级)。用户4、5、6是用户(级别1)。
Teams (ID, Name)
1 Team Alpha
2 Team Bravo
3 Sup Team
UsersToTeams (ID INT PK, UserID INT FK, TeamID INT FK, isSupervisor BIT)
1 1 3 1 -- Archie supervises Sup Team
2 2 3 0 -- Betty is a member of Sup Team
3 3 3 0 -- Chuck is a member of Sup Team
4 2 1 1 -- Betty supervises team Alpha
5 4 1 0 -- Dilton is a member of team Alpha
6 5 1 0 -- Eddie is a member of team Alpha
7 3 2 1 -- Chuck supervises Team Bravo
8 6 2 0 -- Fannie is a member of Team Bravo因此:
对不起,我试过了那个SQL小提琴链接,但是在15分钟的“构建模式”之后,我对它失去了希望。
发布于 2013-07-05 19:34:48
您可以使用递归的CTE来完成这一任务。
首先,选择用户自己,然后递归地选择他立即监视的所有用户:
declare @userID int = 1;
with u as (
select id from users where id = @userID
union all
select lacky.userID from u supervisor
join usersToTeams supervising on supervising.userID = supervisor.id and isSupervisor = 1
join usersToTeams lacky on lacky.teamID = supervising.teamID and lacky.isSupervisor = 0
)
select * from u这是小提琴:http://www.sqlfiddle.com/#!3/525e1/3
https://stackoverflow.com/questions/17494713
复制相似问题