3

我有两个表 - “用户”和“监督”

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

Users
=====
ID (PK)
UserName

一些用户管理其他用户,所以我建立了第二个表“监督”来管理这个:-

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

此表用于将用户表连接到自身以识别特定用户主管。可能是用户有多个主管,因此此表完美地用于此目的。

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

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 下的每个人,所以它需要查看 Bobs 的直接下属,然后是他们的直接下属,依此类推——它会给出 Margaret、Amy、Emma 和 Carol作为这种情况下的结果。

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

4

3 回答 3

2

您应该使用递归 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 演示

于 2013-07-24T09:13:52.903 回答
1

在我看来,您需要递归 CTE。本文作为入门,并包含一个与您所拥有的非常相似的示例:

http://blog.sqlauthority.com/2012/04/24/sql-server-introduction-to-hierarchical-query-using-a-recursive-cte-a-primer/

希望能帮助到你。

于 2013-07-24T09:13:38.830 回答
1
WITH MyCTE
AS ( 

-- ID's and Names
SELECT SuperID, ID
FROM Users
join dbo.Supervision
on ID = dbo.Supervision.UserID
WHERE UserID = 1

UNION ALL

--Who Manages who...
SELECT s.SuperID, ID
FROM Supervision s
INNER JOIN MyCTE ON s.UserID = MyCTE.SuperID
WHERE s.UserID IS NOT NULL 

)

SELECT distinct MyCTE.ID, NAMES.UserName, '<------Reports to ' as Hierarchy, res_name.UserName
FROM MyCTE
join dbo.Users NAMES on 
MyCTE.ID = NAMES.ID 

join dbo.Users res_name 
on res_name.ID = MyCTE.SuperID

order by MyCTE.ID, NAMES.UserName, res_name.UserName
于 2013-07-24T09:56:02.350 回答