Artikel ini menerangkan Ekspresi Jadual Biasa Rekursif SQL (CTEs) untuk menanyakan data hierarki. Ia memperincikan struktur mereka, menggunakan contoh carta organisasi, dan menangani perangkap biasa seperti rekursi tak terhingga dan tidak betul. Opti
Ekspresi Jadual Biasa Rekursif (CTE) adalah alat yang berkuasa dalam SQL untuk menanyakan data hierarki, seperti carta organisasi, sistem fail, atau bil-bahan. Mereka membolehkan anda melintasi struktur seperti pokok dengan berulang kali merujuk CTE itu sendiri dalam definisi. Struktur asas melibatkan ahli utama (pertanyaan awal) dan ahli rekursif (bahagian rujukan diri).
Mari kita gambarkan dengan contoh mudah carta organisasi yang diwakili dalam jadual yang dinamakan employees
:
<code class="sql">CREATE TABLE employees ( employee_id INT PRIMARY KEY, employee_name VARCHAR(255), manager_id INT ); INSERT INTO employees (employee_id, employee_name, manager_id) VALUES (1, 'CEO', NULL), (2, 'VP Sales', 1), (3, 'Sales Rep 1', 2), (4, 'Sales Rep 2', 2), (5, 'VP Marketing', 1), (6, 'Marketing Manager', 5);</code>
Untuk mendapatkan keseluruhan hierarki di bawah Ketua Pegawai Eksekutif (Pekerja_ID 1), kami menggunakan CTE rekursif:
<code class="sql">WITH RECURSIVE EmployeeHierarchy AS ( -- Anchor member: Selects the CEO SELECT employee_id, employee_name, manager_id, 0 as level FROM employees WHERE employee_id = 1 UNION ALL -- Recursive member: Joins with itself to find subordinates SELECT e.employee_id, e.employee_name, e.manager_id, eh.level 1 FROM employees e INNER JOIN EmployeeHierarchy eh ON e.manager_id = eh.employee_id ) SELECT * FROM EmployeeHierarchy;</code>
Pertanyaan ini bermula dengan Ketua Pegawai Eksekutif dan secara rekursif menambah bawahan sehingga tidak ada lagi pekerja yang melaporkan kepada mereka yang sudah disertakan. Lajur level
menunjukkan kedalaman dalam hierarki. UNION ALL
menggabungkan hasil para ahli sauh dan rekursif. Kuncinya ialah menyertai diri antara employees
dan EmployeeHierarchy
dalam anggota rekursif, yang menghubungkan setiap pekerja dengan pengurus mereka.
Beberapa perangkap boleh menyebabkan keputusan yang salah atau isu prestasi ketika bekerja dengan CTE rekursif:
NULL
dalam lajur ID induk) atau dengan mengehadkan kedalaman rekursi.UNION ALL
bukan UNION
akan termasuk baris pendua jika mereka wujud dalam hierarki. Gunakan UNION
jika anda perlu menghapuskan pendua. Walau bagaimanapun, UNION ALL
lebih cepat.CTE rekursif boleh perlahan pada dataset hierarki yang sangat besar. Beberapa strategi pengoptimuman dapat meningkatkan prestasi:
WHERE
klausa kepada ahli sauh dan/atau rekursif untuk menyaring cabang -cabang yang tidak perlu hierarki. Ini mengurangkan jumlah data yang diproses.CTE rekursif disokong oleh kebanyakan sistem pangkalan data utama, tetapi sintaks mungkin sedikit berbeza:
WITH RECURSIVE
(walaupun kata kunci RECURSIVE
adalah pilihan).WITH RECURSIVE
.START WITH
dan CONNECT BY
klausa, yang mempunyai sintaks yang sedikit berbeza tetapi mencapai fungsi yang sama.Walaupun konsep teras tetap sama di seluruh sistem yang berbeza, sentiasa berunding dengan dokumentasi sistem pangkalan data khusus anda untuk sintaks yang betul dan sebarang batasan atau pengoptimuman khusus sistem. Ingatlah untuk menguji pertanyaan anda dengan teliti dan profil prestasi mereka untuk mengenal pasti dan menangani kesesakan.
Atas ialah kandungan terperinci Bagaimanakah saya menggunakan CTE rekursif dalam SQL untuk menanyakan data hierarki?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!