Heim >Datenbank >MySQL-Tutorial >Wie kann ein rekursiver Self-Join in SQL Server zum Abrufen einer Mitarbeiterhierarchie verwendet werden?

Wie kann ein rekursiver Self-Join in SQL Server zum Abrufen einer Mitarbeiterhierarchie verwendet werden?

Susan Sarandon
Susan SarandonOriginal
2025-01-17 15:26:08336Durchsuche

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

Rekursiver SQL Server-Self-Join für die Mitarbeiterhierarchie

Ein rekursiver Self-Join in SQL Server ist eine leistungsstarke Technik zum Navigieren in hierarchischen Datenstrukturen. Lassen Sie uns dies anhand einer Mitarbeitertabelle veranschaulichen, in der jeder Mitarbeiter eine eindeutige ID und die ID seines Vorgesetzten hat:

Beispiel für eine Mitarbeitertabelle:

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

Die Herausforderung:

Unser Ziel ist es, die vollständige Mitarbeiterhierarchie unter einem bestimmten Manager (z. B. John Doe) abzurufen. Ein rekursiver Self-Join bietet eine elegante Lösung.

Die Lösung:

Dies können wir mit der WITH-Anweisung (Common Table Expression oder CTE) erreichen:

<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>

Diese Abfrage beginnt mit dem Stammmitarbeiter (kein Manager) und verknüpft die employees-Tabelle rekursiv mit dem CTE (EmployeeHierarchy), wodurch die Hierarchie Ebene für Ebene erweitert wird, bis alle Untergebenen einbezogen sind.

Aufrechterhaltung der hierarchischen Ordnung:

Um die richtige hierarchische Reihenfolge beizubehalten, können wir die Abfrage erweitern:

<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>

Diese verbesserte Abfrage fügt eine HierarchyPath-Spalte hinzu, die einen eindeutigen Pfad für jeden Mitarbeiter erstellt und so eine ordnungsgemäße hierarchische Sortierung in der Endausgabe gewährleistet. Die ROW_NUMBER()-Funktion und die Zeichenfolgenverkettung behalten die Eltern-Kind-Beziehungen bei.

Das obige ist der detaillierte Inhalt vonWie kann ein rekursiver Self-Join in SQL Server zum Abrufen einer Mitarbeiterhierarchie verwendet werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn