Menguasai Gabungan Kendiri Rekursif dalam Pelayan SQL untuk Data Hierarki
Sambungan diri rekursif adalah penting untuk menavigasi struktur data hierarki dalam jadual SQL Server. Teknik ini amat berguna apabila berurusan dengan data yang diatur dalam perhubungan ibu bapa-anak, seperti carta organisasi atau salasilah keluarga.
Pendekatan mudah untuk sambung diri rekursif menggunakan ungkapan jadual biasa (CTE):
<code class="language-sql">WITH q AS ( SELECT * FROM mytable WHERE ParentID IS NULL UNION ALL SELECT m.* FROM mytable m JOIN q ON m.parentID = q.PersonID ) SELECT * FROM q;</code>
Pertanyaan ini mentakrifkan CTE rekursif, q
. Pernyataan awal SELECT
mengenal pasti nod akar (yang mempunyai ParentID
sebagai NULL). UNION ALL
menggabungkan ini dengan pernyataan SELECT
berikutnya yang secara rekursif menyertai CTE dengan mytable
untuk memasukkan semua keturunan. Penyata SELECT
akhir mendapatkan semula set data hierarki lengkap.
Mengekalkan Susunan Hierarki
Untuk mengekalkan struktur dan susunan hierarki asal, pertanyaan yang diubah suai diperlukan:
<code class="language-sql">WITH q AS ( SELECT m.*, CAST(ROW_NUMBER() OVER (ORDER BY m.PersonId) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN AS bc FROM mytable m WHERE ParentID IS NULL UNION ALL SELECT m.*, q.bc + '.' + CAST(ROW_NUMBER() OVER (PARTITION BY m.ParentID ORDER BY m.PersonID) AS VARCHAR(MAX)) COLLATE Latin1_General_BIN FROM mytable m JOIN q ON m.parentID = q.PersonID ) SELECT * FROM q ORDER BY bc;</code>
Pertanyaan dipertingkat ini menambah lajur bc
menggunakan ROW_NUMBER()
untuk menetapkan pengecam unik, mengekalkan susunan dalam setiap peringkat hierarki. Klausa ORDER BY bc
memastikan hasil akhir mencerminkan struktur pokok asal. Melaraskan klausa ORDER BY
dalam fungsi ROW_NUMBER()
membolehkan penyesuaian susunan nod adik beradik.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Melakukan Gabungan Sendiri Rekursif dalam Pelayan SQL untuk Meneroka Data Hierarki?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!