ホームページ >データベース >mysql チュートリアル >SQL Server の再帰的自己結合を使用して従業員階層を取得するにはどうすればよいですか?

SQL Server の再帰的自己結合を使用して従業員階層を取得するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-17 15:26:08336ブラウズ

How Can a Recursive Self-Join in SQL Server Be Used to Retrieve an Employee Hierarchy?

従業員階層の SQL Server 再帰的自己結合

SQL Server の再帰的自己結合は、階層データ構造をナビゲートするための強力な手法です。 各従業員が一意の ID と上司の ID を持つ従業員テーブルを使用してこれを説明してみましょう。

従業員テーブルの例:

<code>| EmployeeID | Name       | ManagerID |
|------------|------------|------------|
| 1          | John Doe   | NULL       |
| 2          | Jane Smith | 1          |
| 3          | Mary Jones | 2          |
| 4          | Bob Johnson| 3          |</code>

課題:

私たちの目標は、特定のマネージャー (例: John Doe) の下にある完全な従業員階層を取得することです。 再帰的自己結合は洗練されたソリューションを提供します。

解決策:

これは、WITH ステートメント (共通テーブル式または CTE) を使用して実現できます。

<code class="language-sql">WITH EmployeeHierarchy AS (
  SELECT
    EmployeeID,
    Name,
    ManagerID
  FROM
    employees
  WHERE
    ManagerID IS NULL  -- Start with the top-level employee (no manager)
  UNION ALL
  SELECT
    e.EmployeeID,
    e.Name,
    e.ManagerID
  FROM
    employees e
  JOIN
    EmployeeHierarchy q
    ON e.ManagerID = q.EmployeeID  -- Recursively join to itself
)
SELECT
  *
FROM
  EmployeeHierarchy;</code>

このクエリはルート従業員 (マネージャーなし) から始まり、employees テーブルを CTE (EmployeeHierarchy) に再帰的に結合し、すべての部下が含まれるまで階層レベルをレベルごとに拡張します。

階層順序の維持:

正しい階層順序を維持するために、クエリを拡張できます。

<code class="language-sql">WITH EmployeeHierarchy AS (
  SELECT
    EmployeeID,
    Name,
    ManagerID,
    CAST(ROW_NUMBER() OVER (ORDER BY EmployeeID) AS VARCHAR(MAX)) AS HierarchyPath
  FROM
    employees
  WHERE
    ManagerID IS NULL
  UNION ALL
  SELECT
    e.EmployeeID,
    e.Name,
    e.ManagerID,
    q.HierarchyPath + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY e.ManagerID ORDER BY e.EmployeeID) AS VARCHAR(MAX))
  FROM
    employees e
  JOIN
    EmployeeHierarchy q
    ON e.ManagerID = q.EmployeeID
)
SELECT
  *
FROM
  EmployeeHierarchy
ORDER BY
  HierarchyPath;</code>

この改良されたクエリでは HierarchyPath 列が追加され、各従業員に一意のパスが作成され、最終出力で適切な階層並べ替えが保証されます。 ROW_NUMBER() 関数と文字列の連結により、親子関係が維持されます。

以上がSQL Server の再帰的自己結合を使用して従業員階層を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。