首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归SQL查询,但不是通常的递归类型。

递归SQL查询,但不是通常的递归类型。
EN

Stack Overflow用户
提问于 2013-07-05 18:12:40
回答 1查看 269关注 0票数 0

我有一套表格,把一群人组织成一个团队。

  • 用户(ID、int、PK等)
  • 小组(ID int PK等)
  • UsersToTeams ( int,UserID int,TeamID int,TeamSupervisor位null)

表中没有父ID,因为用户可以在任意数量的团队中,并且团队可以有任意数量的主管。用户可能在六个团队中,但只监督其中两个团队,其中一个或两个被监督的团队中可能都有其他主管。所以我的层次结构看起来更像一个网络而不是一棵树。

我认识到递归查询可能会导致循环引用。假设软件目前正在处理这个问题。

公司的层次结构是由监督用户团队的主管、监督监督团队的经理等等描述的,所以它是分层的,但不是通常的方式。

我需要一个查询,在给定一个UserID的情况下,这个查询将返回他所监视的用户的ID,并且返回无限级别的ID。这样的查询会如何进行?

示例

代码语言:javascript
复制
Users (ID, Name)
1 Archie
2 Betty
3 Chuck
4 Dilton
5 Eddie
6 Fannie

用户1是一个管理器(3级)。用户2和3是监督员(2级)。用户4、5、6是用户(级别1)。

代码语言:javascript
复制
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
  • 阿奇是一名经理,监督着一组主管。
  • 贝蒂是一名监督员,负责监督一组用户。
  • 查克是一名监督员,负责监督一组用户。
  • 贝蒂和查克也在阿奇的队伍里,但不要监督。

因此:

  1. 如果我通过了UserID 5(埃迪),我应该只得到5,因为埃迪没有监督任何人。
  2. 如果我通过了UserID 3(恰克),我应该得到3和6,因为房利美是一个团队,恰克监督。
  3. 如果我通过了UserID 1 (Archie),我应该获得这里描述的所有用户If,因为贝蒂和查克都在阿尔奇的团队中,其他人都在贝蒂的团队或查克的团队。

对不起,我试过了那个SQL小提琴链接,但是在15分钟的“构建模式”之后,我对它失去了希望。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-05 19:34:48

您可以使用递归的CTE来完成这一任务。

首先,选择用户自己,然后递归地选择他立即监视的所有用户:

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17494713

复制
相关文章

相似问题

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