SQL Academy · Pelajaran

CTE Rekursif untuk Hierarki

Telusuri data berhierarki (carta organisasi, komen berjujukan, traversal graf) dengan WITH RECURSIVE dan syarat penghentian.

Pelajaran 4 daripada 413 langkah

CTE Rekursif untuk Hierarki ialah pelajaran SQL Academy percuma di CoddyKit. Ini ialah pelajaran 4 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 SQL Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.

Mengapakah Rekursif

SQL biasa tidak boleh merentasi pepohon yang kedalamannya tidak diketahui: ibu bapa kepada ibu bapa, anak kepada anak. CTE rekursif ialah penyelesaian SQL standard.

Anatomi

CTE rekursif mempunyai dua bahagian yang disambungkan oleh UNION ALL:

WITH RECURSIVE name AS (
  -- 1. Anchor query: seed rows
  SELECT ...
  UNION ALL
  -- 2. Recursive step: references the CTE itself
  SELECT ...
  FROM name JOIN ...
)
SELECT * FROM name;

Merentasi Carta Organisasi

Cari semua pekerja yang melaporkan (secara langsung atau tidak langsung) kepada pengurus tertentu:

WITH RECURSIVE reports AS (
  -- anchor: the manager themself
  SELECT id, full_name, manager_id, 0 AS depth
  FROM employees WHERE id = 42

  UNION ALL

  -- recurse: people whose manager is in reports
  SELECT e.id, e.full_name, e.manager_id, r.depth + 1
  FROM employees e
  JOIN reports r ON r.id = e.manager_id
)
SELECT * FROM reports ORDER BY depth, full_name;

Komen Berutas

Merentasi pepohon perbincangan bermula daripada akar:

WITH RECURSIVE thread AS (
  SELECT id, parent_id, body, 0 AS depth, ARRAY[id] AS path
  FROM comments WHERE id = $1
  UNION ALL
  SELECT c.id, c.parent_id, c.body, t.depth + 1, t.path || c.id
  FROM comments c
  JOIN thread t ON c.parent_id = t.id
)
SELECT * FROM thread ORDER BY path;

Penamatan

Rekursi berhenti apabila langkah rekursif tidak mengembalikan baris baharu.

Mengelakkan Gelung Tidak Berkesudahan

Jika graf anda mempunyai kitaran, jejaki nod yang telah dilawati:

WITH RECURSIVE walk AS (
  SELECT id, ARRAY[id] AS path FROM nodes WHERE id = $1
  UNION ALL
  SELECT e.target_id, w.path || e.target_id
  FROM edges e
  JOIN walk w ON e.source_id = w.id
  WHERE e.target_id <> ALL(w.path)
)
SELECT * FROM walk;

Siri Berangka

CTE rekursif juga boleh menjana jujukan:

WITH RECURSIVE n(i) AS (
  VALUES (1)
  UNION ALL
  SELECT i + 1 FROM n WHERE i < 100
)
SELECT i, i*i AS square FROM n;

Senarai Bahan

Kembangkan produk kepada semua komponennya, termasuk subpemasangan:

WITH RECURSIVE bom AS (
  SELECT part_id, sub_part_id, qty FROM parts WHERE part_id = $1
  UNION ALL
  SELECT p.part_id, p.sub_part_id, p.qty * bom.qty
  FROM parts p
  JOIN bom ON bom.sub_part_id = p.part_id
)
SELECT sub_part_id, SUM(qty) AS total_qty FROM bom GROUP BY sub_part_id;

Had Kedalaman

Untuk keselamatan, hadkan kedalaman rekursi:

WITH RECURSIVE tree AS (
  SELECT id, parent_id, 0 AS depth FROM nodes WHERE id = $1
  UNION ALL
  SELECT n.id, n.parent_id, t.depth + 1
  FROM nodes n JOIN tree t ON n.parent_id = t.id
  WHERE t.depth < 10
)
SELECT * FROM tree;

UNION berbanding UNION ALL

UNION ALL ialah pilihan yang lazim. UNION membuang pendua — berguna apabila sesuatu nod boleh dicapai melalui beberapa laluan.

Prestasi

CTE rekursif dinilai secara berlelar. "Jadual kerja" setiap langkah ialah baris yang dihasilkan oleh langkah sebelumnya. Indekskan lajur JOIN.

Imbas Kembali

CTE rekursif merentasi hierarki dan graf.

  • Sauh + UNION ALL + langkah rekursif
  • Berhenti apabila langkah rekursif tidak mengembalikan baris
  • Gunakan tatasusunan laluan untuk memutuskan kitaran

Semakan Pantas

Kata kunci apakah yang menjadikan CTE sebagai CTE rekursif?

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
46
Pelajaran
183

Soalan Lazim

Adakah pelajaran “CTE Rekursif untuk Hierarki” percuma?

Ya — teks penuh “CTE Rekursif 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 SQL Academy, tingkat taraf kepada CoddyKit PRO. Kursus SQL Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “CTE Rekursif untuk Hierarki”?

Telusuri data berhierarki (carta organisasi, komen berjujukan, traversal graf) dengan WITH RECURSIVE dan syarat penghentian. Anda berlatih SQL Academy 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 SQL Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran SQL Academy 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 4 daripada 4.

Berapa lamakah pelajaran “CTE Rekursif 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 SQL Academy ini?

Ya. Setiap pelajaran SQL Academy 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. Subpertanyaan Skalar, Baris dan Jadual
  2. Subpertanyaan Berkorelasi berbanding Tidak Berkorelasi
  3. Ungkapan Jadual Biasa (WITH)
  4. CTE Rekursif untuk Hierarki
← Kembali ke SQL Academy