2

就職の面接で次の質問を受けたのですが、完全に困惑したので、どなたか説明していただけないでしょうか。次のテーブルがあるとします。

employees
--------------------------
id | name     | reportsTo
--------------------------
 1 | Alex     | 2
 2 | Bob      | NULL
 3 | Charlie  | 5
 4 | David    | 2
 5 | Edward   | 8
 6 | Frank    | 2
 7 | Gary     | 8
 8 | Harry    | 2
 9 | Ian      | 8

問題は、各従業員の名前の列と、組織内でその従業員の上にいる人数を示す列を含むテーブルを返す SQL クエリを作成することでした。

hierarchy
--------------------------
name     | hierarchyLevel
--------------------------
Alex     | 1
Bob      | 0
Charlie  | 3
David    | 1
Edward   | 2
Frank    | 1
Gary     | 2
Harry    | 1
Ian      | 2

これを SQL クエリとしてどこから書き始めればよいかさえわかりません (カーソルか?)。これと同様の質問を再度受けた場合、誰か助けてもらえますか? ありがとう。

4

1 に答える 1

2

最も簡単な例は、(実際のまたは一時的な) テーブルを使用し、一度に 1 つのレベルを追加することです ( fiddle ):

INSERT INTO hierarchy
SELECT id, name, 0
FROM employees
WHERE reportsTo IS NULL;

WHILE ((SELECT COUNT(1) FROM employees) <> (SELECT COUNT(1) FROM hierarchy))
BEGIN
    INSERT INTO hierarchy
    SELECT e.id, e.name, h.hierarchylevel + 1
    FROM employees e
    INNER JOIN hierarchy h ON e.reportsTo = h.id
    AND NOT EXISTS(SELECT 1 FROM hierarchy hh WHERE hh.id = e.id)
END

その他のソリューションは、RDBMS ごとに若干異なります。一例として、SQL Server では、再帰 CTE を使用して展開できます ( fiddle )。

;WITH expanded AS
(
    SELECT id, name, 0 AS level
    FROM employees
    WHERE reportsTo IS NULL
    UNION ALL
    SELECT e.id, e.name, level + 1 AS level
    FROM expanded x
    INNER JOIN employees e ON e.reportsTo = x.id
)
SELECT * 
FROM expanded
ORDER BY id

その他のソリューションには、再帰的なストアド プロシージャが含まれます。また、動的 SQL を使用して、すべてのユーザーが処理されるまで結合の数を繰り返し増やします。

もちろん、これらの例はすべて、サイクルがなく、誰もがチェーンをたどってヘッドホンチョ ( reportsTo = NULL) に到達できることを前提としています。

于 2013-08-09T18:27:06.107 に答える