SELF JOIN untuk Hierarki
Cantumkan jadual dengan dirinya sendiri untuk memodelkan hubungan pekerja-pengurus dan induk-anak
SELF JOIN untuk Hierarki ialah pelajaran Persediaan Temu Duga SQL percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Persediaan Temu Duga SQL, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.
Apakah Sebenarnya SELF JOIN
Cantuman kendiri hanyalah cantuman yang menggunakan satu jadual pada kedua-dua sisi. Tiada kata kunci khas SELF JOIN; anda menulis INNER atau LEFT JOIN biasa dan merujuk jadual yang sama dua kali.
Helah yang menjadikannya berfungsi ialah nama pengganti jadual. Anda memberikan nama pengganti yang berbeza kepada setiap salinan supaya enjin menganggapnya sebagai dua jadual bebas.
SELECT e.name, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;Mengapa Nama Pengganti Diwajibkan
Tanpa nama pengganti yang berbeza, pertanyaan menjadi kabur: setiap nama lajur muncul dua kali dan enjin tidak dapat menentukan salinan yang anda maksudkan. Memberikan nama berbeza kepada setiap salinan menyelesaikan masalah ini.
Baca cantuman itu sebagai 'padankan setiap baris pekerja dengan baris pekerja yang menjadi pengurusnya.' Nama e ialah pekerja, m ialah pengurus, dan kedua-duanya berasal daripada jadual fizikal yang sama.
-- e = the employee, m = that employee's manager
SELECT e.id, e.name, m.name AS reports_to
FROM employees AS e
JOIN employees AS m ON e.manager_id = m.id;Model Pekerja-Pengurus
Senario cantuman kendiri klasik ialah senarai kejiranan: satu jadual menyimpan baris, dan setiap baris menunjuk kepada induknya melalui kunci asing dalam jadual yang sama.
Jadual employees dengan manager_id yang merujuk kepada employees.id memodelkan keseluruhan carta organisasi dalam satu jadual. Setiap pengurus hanyalah baris pekerja yang lain.
-- One table holds the whole hierarchy
-- employees(id, name, manager_id)
-- manager_id -> employees.idMenyenaraikan Semua Orang Bersama Pengurus Mereka
Soalan cantuman kendiri yang paling kerap ditanya: paparkan setiap pekerja di sebelah nama pengurus mereka. Cantumkan salinan pekerja dengan salinan pengurus pada e.manager_id = m.id.
Ini mengembalikan satu baris bagi setiap pekerja yang pengurusnya wujud. Perhatikan bahawa bahagian paling atas organisasi, CEO, mempunyai NULL manager_id dan akan dikecualikan oleh cantuman dalam.
SELECT e.name AS employee, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;LEFT JOIN untuk Mengekalkan Akar Pepohon
Untuk menyertakan CEO (yang manager_id-nya ialah NULL), tukar kepada LEFT JOIN. Sisi pekerja dikekalkan; lajur pengurus mengembalikan NULL bagi baris tanpa induk.
Penemuduga menggunakan ini untuk menguji sama ada anda ingat bahawa cantuman kendiri dalam menggugurkan nod akar. Pembaikannya sama seperti mana-mana keadaan cantuman luar 'kekalkan baris yang tiada padanan'.
SELECT e.name AS employee,
COALESCE(m.name, '(top level)') AS manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id;Mengira Bawahan Langsung bagi Setiap Pengurus
Susulan yang biasa: berapa ramai orang melapor terus kepada setiap pengurus? Lakukan cantuman kendiri, kemudian kumpulkan mengikut pengurus.
Kita mencantumkan pekerja dengan pengurus, mengumpulkan mengikut identiti pengurus dan mengira pekerja. Ini mengira bawahan langsung sahaja, bukan keseluruhan subpokok di bawah mereka.
SELECT m.name AS manager, COUNT(*) AS direct_reports
FROM employees e
JOIN employees m ON e.manager_id = m.id
GROUP BY m.id, m.name
ORDER BY direct_reports DESC;Menelusuri Dua Tahap ke Bawah
Untuk mendapatkan seorang pekerja, pengurusnya dan pengurus kepada pengurusnya, rantaikan tiga salinan jadual. Setiap tahap ialah satu lagi cantuman kendiri.
Ini berfungsi untuk kedalaman yang tetap dan diketahui. Jika anda memerlukan kedalaman sewenang-wenangnya, cantuman kendiri tidak mencukupi; itu ialah petunjuk untuk menggunakan CTE rekursif, yang dijangka disebut oleh penemuduga.
SELECT e.name AS employee,
m.name AS manager,
g.name AS grand_manager
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.id
LEFT JOIN employees g ON m.manager_id = g.id;Cantuman Kendiri berbanding CTE Rekursif
Perbezaan utama yang diuji oleh penemuduga:
- Cantuman kendiri mengendalikan bilangan tahap yang tetap. Tiga salinan = tiga tahap, tidak lebih.
- CTE rekursif mengendalikan kedalaman tidak terhad dengan mencantumkan semula jadual dengan dirinya sendiri sehingga tiada baris baharu muncul.
Jadi, 'paparkan setiap pekerja dan pengurus langsungnya' ialah cantuman kendiri, tetapi 'senaraikan setiap leluhur sepanjang rantaian' memerlukan rekursi.
Kategori Induk-Anak
Corak yang sama memodelkan apa-apa pepohon: kategori produk, rangkaian komen dan wilayah geografi. Jadual categories dengan parent_id yang merujuk kepada id sendiri mempunyai bentuk yang sama seperti kes pekerja-pengurus.
Menyedari bahawa 'jadual dengan kunci asing yang merujuk kepada dirinya sendiri' bersamaan dengan 'cantuman kendiri atau rekursi' ialah pemahaman yang boleh digunakan semula.
SELECT c.name AS category,
p.name AS parent_category
FROM categories c
LEFT JOIN categories p ON c.parent_id = p.id;Kesilapan Lazim dalam Cantuman Kendiri
Perhatikan perkara ini dalam temu duga:
- Melupakan nama pengganti, lalu menyebabkan ralat lajur yang tidak jelas.
- Menggunakan
INNER JOINdan secara senyap menggugurkan baris akar (induk NULL). - Mencantumkan dalam arah yang salah:
e.id = m.manager_iddan bukannyae.manager_id = m.id.
Sentiasa nyatakan dengan jelas nama pengganti yang merupakan anak dan yang merupakan induk sebelum menulis ON.
Bila Perlu Menggunakan Cantuman Kendiri
Gunakan cantuman kendiri apabila jadual mengaitkan baris dengan baris lain dalam jadual yang sama:
- Hierarki dengan satu tahap carian tetap (pekerja kepada pengurus).
- Memadankan atau membandingkan baris dalam satu jadual (diterangkan dalam pelajaran seterusnya).
Jika hubungannya rekursif dan tidak terhad, nyatakan CTE rekursif sebagai alat yang lebih sesuai. Nuansa itu membezakan pembangun baharu daripada pembangun peringkat pertengahan.
Semakan Pantas
Uji pemahaman anda tentang cantuman kendiri dalam hierarki.
Ringkasan: SELF JOIN untuk Hierarki
Perkara penting:
- Cantuman kendiri ialah cantuman biasa dengan jadual yang sama pada kedua-dua sisi, dibezakan melalui nama pengganti.
- Senarai kejiranan (kunci asing yang merujuk kepada diri sendiri seperti
manager_id) memodelkan pepohon dalam satu jadual. - Gunakan
INNER JOINuntuk pasangan sepadan;LEFT JOINuntuk mengekalkan baris akar dengan induk NULL. - Cantuman kendiri mengendalikan kedalaman tetap; penelusuran tidak terhad memerlukan CTE rekursif.
Pelajari SQL dengan tutor kecerdasan buatan — percuma
Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.
- Kursus
- 30
- Pelajaran
- 120
Soalan Lazim
Adakah pelajaran “SELF JOIN untuk Hierarki” percuma?
Ya — teks penuh “SELF JOIN untuk Hierarki” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Persediaan Temu Duga SQL, tingkat taraf kepada CoddyKit PRO. Kursus Persediaan Temu Duga SQL merangkumi sejumlah 4 pelajaran.
Apakah yang akan saya pelajari dalam “SELF JOIN untuk Hierarki”?
Cantumkan jadual dengan dirinya sendiri untuk memodelkan hubungan pekerja-pengurus dan induk-anak Anda berlatih Persediaan Temu Duga SQL menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.
Adakah saya memerlukan pengalaman untuk memulakan Persediaan Temu Duga SQL?
Tiada pengalaman terdahulu diperlukan. Pembelajaran Persediaan Temu Duga SQL di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.
Berapa lamakah pelajaran “SELF JOIN untuk Hierarki” diambil?
Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.
Bolehkah saya menulis dan menjalankan kod dalam pelajaran Persediaan Temu Duga SQL ini?
Ya. Setiap pelajaran Persediaan Temu Duga SQL menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.
Semua pelajaran dalam kursus ini
- CROSS JOIN dan Hasil Cartesian
- SELF JOIN untuk Hierarki
- Membandingkan Baris Dalam Satu Jadual
- Memilih Jenis Cantuman yang Tepat