Apa cara paling sederhana untuk melakukan self-join rekursif di SQL Server? Saya punya meja seperti ini:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
5 YT NULL
6 IS 5
Dan saya ingin mendapatkan catatan yang hanya terkait dengan hierarki yang dimulai dengan orang tertentu. Jadi Jika saya meminta hierarki CJ oleh PersonID = 1 saya akan mendapatkan:
PersonID | Initials | ParentID
1 CJ NULL
2 EB 1
3 MB 1
4 SW 2
Dan untuk EB, saya akan mendapatkan:
PersonID | Initials | ParentID
2 EB 1
4 SW 2
Saya agak terjebak dalam hal ini, saya tidak bisa memikirkan bagaimana melakukannya selain dari respons kedalaman tetap berdasarkan sekelompok gabungan. Ini akan terjadi karena kami tidak akan memiliki banyak level tetapi saya ingin melakukannya dengan benar.
Terima kasih! Chris.
Jawaban:
Dengan menambahkan kondisi pemesanan, Anda dapat mempertahankan urutan pohon:
Dengan mengubah
ORDER BY
kondisi, Anda dapat mengubah urutan saudara kandung.sumber
PersonID = theIdYouAreLookingFor
bukanParentID IS NULL
.WITH
klausa. Jika Anda membutuhkan informasi spesifik, silakan buat biola di sqlfiddle.com dan posting tautannya di sini.Dengan menggunakan CTE, Anda dapat melakukannya dengan cara ini
sumber
Kueri Quassnoi dengan perubahan untuk tabel besar. Orang tua dengan lebih banyak anak daripada 10: Membentuk sebagai str (5) the row_number ()
sumber
SQL 2005 atau yang lebih baru, CTE adalah cara standar untuk digunakan sesuai contoh yang ditampilkan.
SQL 2000, Anda dapat melakukannya menggunakan UDF -
(yang akan berhasil pada tahun 2005, ini bukan cara standar untuk melakukannya. Meskipun demikian, jika Anda menemukan cara yang lebih mudah untuk bekerja, jalankan dengan itu)
Jika Anda benar-benar perlu melakukan ini di SQL7, Anda dapat melakukan secara kasar hal di atas dalam sproc tetapi tidak dapat memilih darinya - SQL7 tidak mendukung UDF.
sumber
Periksa berikut untuk membantu memahami konsep rekursi CTE
sumber