Rumah >pangkalan data >tutorial mysql >Bagaimanakah Penyertaan Diri Rekursif dalam Pelayan SQL Digunakan untuk Mendapatkan Hierarki Pekerja?

Bagaimanakah Penyertaan Diri Rekursif dalam Pelayan SQL Digunakan untuk Mendapatkan Hierarki Pekerja?

Susan Sarandon
Susan Sarandonasal
2025-01-17 15:26:08336semak imbas

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

SQL Server Recursive Self-Join untuk Hierarki Pekerja

Penyertaan diri rekursif dalam SQL Server ialah teknik yang berkuasa untuk menavigasi struktur data hierarki. Mari kita gambarkan ini menggunakan jadual pekerja di mana setiap pekerja mempunyai ID unik dan ID penyelia mereka:

Contoh Jadual Pekerja:

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

Cabaran:

Matlamat kami adalah untuk mendapatkan semula hierarki pekerja yang lengkap di bawah pengurus tertentu (cth., John Doe). Sambungan diri rekursif memberikan penyelesaian yang elegan.

Penyelesaian:

Kita boleh mencapai ini menggunakan pernyataan WITH (Ungkapan Jadual Biasa atau 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>

Pertanyaan ini bermula dengan pekerja akar (tiada pengurus) dan secara rekursif menyertai jadual employees ke CTE (EmployeeHierarchy), mengembangkan peringkat hierarki mengikut peringkat sehingga semua orang bawahan disertakan.

Mengekalkan Susunan Hierarki:

Untuk mengekalkan susunan hierarki yang betul, kami boleh meningkatkan pertanyaan:

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

Pertanyaan dipertingkat ini menambah lajur HierarchyPath, mewujudkan laluan unik untuk setiap pekerja, memastikan pengisihan hierarki yang betul dalam output akhir. Fungsi ROW_NUMBER() dan gabungan rentetan mengekalkan hubungan ibu bapa-anak.

Atas ialah kandungan terperinci Bagaimanakah Penyertaan Diri Rekursif dalam Pelayan SQL Digunakan untuk Mendapatkan Hierarki Pekerja?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn