Persediaan Temu Duga SQL · Pelajaran

Merentasi Carta Organisasi

Telusuri hierarki pekerja-pengurus hingga ke mana-mana kedalaman

Pelajaran 2 daripada 413 langkah

Merentasi Carta Organisasi 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.

Soalan Carta Organisasi

"Diberikan jadual employees dengan id, name dan manager_id, senaraikan semua orang di bawah pengurus tertentu, pada apa-apa kedalaman." Ini ialah salah satu soalan temu duga CTE rekursif yang paling lazim.

Jadual ini merujuk kepada dirinya sendiri: manager_id merujuk kembali kepada id baris yang lain. Dalam pelajaran ini, anda akan menelusurinya ke bawah (bawahan) dan ke atas (rantaian arahan).

Jadual Contoh

Bayangkan data ini. CEO mempunyai pengurus NULL. Semua yang lain melapor ke atas sepanjang rantaian.

  • 1 Ada (pengurus NULL)
  • 2 Ben (pengurus 1)
  • 3 Cleo (pengurus 1)
  • 4 Dan (pengurus 2)
  • 5 Eve (pengurus 4)

Jadi kedalamannya ialah: Ada → Ben → Dan → Eve. Ingat perkara ini semasa kita menelusurinya.

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    manager_id INT REFERENCES employees(id)
);

Menelusuri ke Bawah dari Pengurus

Untuk menyenaraikan semua bawahan di bawah pengurus yang dipilih, ahli sauh memilih pengurus itu (atau bawahan langsungnya), manakala ahli rekursif mengikuti manager_id ke bawah.

Di sini kita bermula daripada Ben (id 2) dan mengumpulkan semua orang di bawahnya.

WITH RECURSIVE subtree AS (
    SELECT id, name, manager_id, 1 AS depth
    FROM employees WHERE id = 2
    UNION ALL
    SELECT e.id, e.name, e.manager_id, s.depth + 1
    FROM employees e
    JOIN subtree s ON e.manager_id = s.id
)
SELECT name, depth FROM subtree ORDER BY depth;

Membaca Keluaran

Kueri di atas mengembalikan Ben pada kedalaman 1, Dan pada kedalaman 2 dan Eve pada kedalaman 3. Ahli sauh memulakan Ben; lelaran pertama menemui Dan (yang pengurusnya ialah Ben); lelaran kedua menemui Eve (yang pengurusnya ialah Dan); lelaran ketiga tidak menemui sesiapa, lalu rekursi berhenti.

Jika penemu duga bertanya "berapa aras di bawah Ben kedudukan Eve?", lajur depth memberikan jawapannya secara langsung: 3 tolak 1 bersamaan 2 aras.

Menelusuri ke Atas kepada CEO

Soalan sebaliknya juga sama lazimnya: "Tunjukkan rantaian arahan penuh Eve hingga kepada CEO." Songsangkan arah cantuman — ahli rekursif kini mengikuti manager_id baris semasa ke atas, menuju kepada induk.

WITH RECURSIVE chain AS (
    SELECT id, name, manager_id, 1 AS lvl
    FROM employees WHERE id = 5
    UNION ALL
    SELECT e.id, e.name, e.manager_id, c.lvl + 1
    FROM employees e
    JOIN chain c ON e.id = c.manager_id
)
SELECT name, lvl FROM chain ORDER BY lvl;

Ke Bawah berbanding Ke Atas: Arah Cantuman Berubah

Satu-satunya perbezaan struktur antara penelusuran ke bawah dan ke atas ialah syarat cantuman:

  • Ke bawah (cari bawahan): e.manager_id = cte.id — padankan pekerja yang pengurusnya ialah baris yang sudah kita miliki.
  • Ke atas (cari pengurus): e.id = cte.manager_id — padankan pekerja yang pengenalnya ialah pengurus baris semasa kita.

Kebolehan menerangkan perubahan arah ini dengan jelas akan menarik perhatian penemu duga.

Membina Pepohon Berinden

Jawapan yang kemas memformat keluaran sebagai pepohon berinden menggunakan depth untuk mengulangi ruang. Ini menunjukkan bahawa anda boleh mempersembahkan hasil hierarki, bukan sekadar mengiranya.

WITH RECURSIVE org AS (
    SELECT id, name, 1 AS depth
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, o.depth + 1
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT REPEAT('  ', depth - 1) || name AS tree
FROM org
ORDER BY depth;

Mengumpulkan Laluan

Untuk menunjukkan laluan penuh dari CEO kepada setiap orang, bawa rentetan path. Ini ialah teknik yang sama daripada pelajaran sebelumnya, yang diterapkan pada carta organisasi.

WITH RECURSIVE org AS (
    SELECT id, name, CAST(name AS VARCHAR(500)) AS path
    FROM employees WHERE manager_id IS NULL
    UNION ALL
    SELECT e.id, e.name, o.path || ' / ' || e.name
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT name, path FROM org ORDER BY path;

Mengira Bawahan bagi Setiap Pengurus

Soalan susulan yang kerap ditanya: "Berapa ramai orang yang melapor kepada setiap pengurus, secara langsung atau tidak langsung?" Gunakan subpepohon rekursif bagi setiap pengurus, kemudian himpunkan hasilnya. Corak yang lazim ialah menjalankan rekursi sekali bagi setiap punca dan menggunakan GROUP BY pada pengurus benih.

Di sini kita mengira semua bawahan tidak langsung di bawah Ada (CEO) dengan menelusuri seluruh pepohon dan mengira baris di bawah punca.

WITH RECURSIVE org AS (
    SELECT id, name, manager_id, 0 AS depth
    FROM employees WHERE id = 1
    UNION ALL
    SELECT e.id, e.name, e.manager_id, o.depth + 1
    FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT COUNT(*) - 1 AS total_reports FROM org;

Kesilapan Lazim

Berwaspada terhadap perangkap yang dipasang oleh penemu duga:

  • Arah cantuman salah — menggunakan e.manager_id = cte.id apabila anda sepatutnya bergerak ke atas akan mengembalikan set yang salah.
  • Terlupa penapis ahli sauh — abaikan WHERE id = X dan anda akan memulakan setiap baris, lalu mengembalikan seluruh hutan.
  • Kedalaman tersasar satu aras — tentukan sama ada baris benih berada pada kedalaman 0 atau 1 dan kekalkan ketetapan itu.

Mengapa Tidak Gunakan Cantuman Kendiri Sahaja

Cantuman kendiri boleh mendapatkan bilangan aras yang tetap: satu cantuman untuk bawahan langsung, dua cantuman untuk bawahan peringkat kedua dan seterusnya. Namun, anda mesti mengetahui kedalaman terlebih dahulu dan menulis satu cantuman bagi setiap aras.

CTE rekursif mengendalikan kedalaman sewenang-wenangnya yang tidak diketahui dalam satu kueri. Apabila penemu duga berkata "hierarki boleh mempunyai apa-apa bilangan aras," hal itu menolak penggunaan cantuman kendiri biasa dan menandakan bahawa rekursi diperlukan.

Semakan Pantas

Pastikan anda boleh menukar arah penelusuran.

Rumusan

Penelusuran carta organisasi ialah rangka rekursif yang digunakan pada jadual yang merujuk kepada dirinya sendiri:

  • Ke bawah: mulakan dengan seorang pengurus, kemudian lakukan e.manager_id = cte.id.
  • Ke atas: mulakan dengan seorang pekerja, kemudian lakukan e.id = cte.manager_id.
  • Simpan depth untuk lekukan dan path untuk keseluruhan rantaian.
  • Rekursi mengendalikan kedalaman yang tidak diketahui, sedangkan cantuman kendiri tidak mampu berbuat demikian.

Seterusnya: menggunakan rekursi untuk menjana siri nombor dan tarikh.

Percuma untuk bermula

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 “Merentasi Carta Organisasi” percuma?

Ya — teks penuh “Merentasi Carta Organisasi” 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 “Merentasi Carta Organisasi”?

Telusuri hierarki pekerja-pengurus hingga ke mana-mana kedalaman 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 “Merentasi Carta Organisasi” 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

  1. Ahli Sauh dan Rekursif
  2. Merentasi Carta Organisasi
  3. Menjana Siri Nombor dan Tarikh
  4. Mengelakkan Rekursi Tanpa Henti
← Kembali ke Persediaan Temu Duga SQL