显示分层数据的 SQL 查询

标签 sql tsql recursive-query

我有两个表 - 'Users' 和 'Supervision'

对于这个例子,我的用户表非常简单:-

Users
=====
ID (PK)
UserName

一些用户管理其他用户,所以我建立了第二个表'Supervision'来管理这个:-

Supervision
===========
UserID
SuperID - this is the ID of the staff member that the user supervises.

此表用于将 Users 表连接到自身以标识特定的用户主管。一个用户可能有多个主管,因此这张表非常适合这个目的。

这是我在“用户”中的示例数据:-

userID  userName
1       Bob
2       Margaret
3       Amy
4       Emma
5       Carol
6       Albert
7       Robert
8       Richard
9       Harry
10      Arthur

还有我在“监督”中的数据:-

userID  superID
1       2
1       3
2       4
2       5
3       4
3       5
6       1
6       7
7       8
7       9
9       10

如果我想知道谁直接向 Bob 报告,写一个 SQL 查询很简单,并告诉我 Margaret 和 Amy 是他的直接报告。

然而,我想做的是编写一个查询,显示 Bob 下的每个人,因此它需要查看 Bob 的直接下属,然后是他们的直接下属,等等 - 它会给 Margaret、Amy、在这种情况下,艾玛和卡罗尔就是结果。

我假设这需要某种递归,但我完全卡住了..

最佳答案

你应该使用 recursive CTE :

WITH RCTE AS 
(
    SELECT * FROM dbo.Supervision WHERE UserID = 1
    UNION ALL
    SELECT s.* FROM dbo.Supervision s 
        INNER JOIN RCTE r ON s.userID = r.superID
)
SELECT DISTINCT u.userID, u.userName 
FROM RCTE r
LEFT JOIN dbo.Users u ON r.superID = u.userID

SQLFiddle DEMO

关于显示分层数据的 SQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17829467/

相关文章:

php - MySql 获取产品搜索结果中的类别数

php - 为什么我的查询没有定义该值?

c# - 如何使用c#在参数中传递转换表达式?

json - 将 JSON 字符串解析为 Postgres 中的键和值

mysql 递归更新

mysql - 连接 3 个子查询

mysql - 连接三个表以便可以替换多个列值

sql-server - 如何跨多个表强制执行 CHECK 约束

sql - 包含特定字符的记录列表的最佳 SQL 查询?

SQL 递归表无限循环