Rumah >pangkalan data >tutorial mysql >Bagaimanakah Penyertaan Diri Rekursif dalam Pelayan SQL Digunakan untuk Mendapatkan Hierarki Pekerja?
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!