3

「ユーザー」と「監督」の2つのテーブルがあります

この例では、私の users テーブルは非常に単純です:-

Users
=====
ID (PK)
UserName

一部のユーザーは他のユーザーを管理しているため、これを管理するために 2 番目のテーブル「監督」を作成しました:-

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 が彼の直属の部下であることがわかります。

しかし、私がやりたいのは、ボブの下にいるすべての人を表示するクエリを作成することです。そのため、ボブの直属の部下、その直属の部下などを調べる必要があります。これにより、マーガレット、エイミー、エマ、キャロルが得られます。この場合の結果として。

これには何らかの再帰が必要だと思いますが、完全に行き詰まっています..

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

Recursive 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 に答える