SQL Academy · Pelajaran

Cara CTE Rekursif Berfungsi

Kes asas ditambah langkah rekursif.

Pelajaran 1 daripada 413 langkah

Cara CTE Rekursif Berfungsi ialah pelajaran SQL Academy percuma di CoddyKit. Ini ialah pelajaran 1 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.

Apakah CTE Rekursif?

CTE rekursif ialah Ungkapan Jadual Biasa yang merujuk kepada dirinya sendiri. Ia membolehkan anda menulis pertanyaan yang mengulangi suatu langkah sehingga syarat dipenuhi — serupa dengan gelung, tetapi dinyatakan sebagai SQL tulen.

CTE rekursif ditakrifkan dengan kata kunci WITH RECURSIVE dan sesuai untuk menelusuri data hierarki atau seperti graf, seperti carta organisasi, pepohon direktori dan struktur senarai bahan.

Struktur Dua Bahagian

Setiap CTE rekursif mempunyai tepat dua bahagian yang dipisahkan oleh UNION ALL:

1. Kes asas — SELECT bukan rekursif yang mengembalikan baris permulaan.

2. Langkah rekursif — SELECT yang mencantumkan CTE dengan dirinya sendiri untuk menghasilkan baris peringkat seterusnya.

Enjin terus menjalankan langkah rekursif dan mengumpulkan hasil sehingga tiada baris baharu dihasilkan.

WITH RECURSIVE cte_name AS (
  -- Base case
  SELECT ...
  UNION ALL
  -- Recursive step (references cte_name)
  SELECT ... FROM source JOIN cte_name ON ...
)
SELECT * FROM cte_name;

Mengira dari 1 hingga 5

CTE rekursif yang paling mudah mengira nombor. Kes asas memulakan nilai 1. Langkah rekursif menambah 1 pada setiap lelaran. Klausa WHERE dalam langkah rekursif bertindak sebagai syarat penamatan — tanpanya, pertanyaan akan berjalan selama-lamanya.

WITH RECURSIVE counter(n) AS (
  SELECT 1
  UNION ALL
  SELECT n + 1 FROM counter WHERE n < 5
)
SELECT n FROM counter;

Pelaksanaan Langkah demi Langkah

Beginilah cara enjin memproses CTE pembilang itu lelaran demi lelaran:

Lelaran 0 (kes asas): mengembalikan {1}.

Lelaran 1: menggunakan langkah rekursif pada {1}, lalu mengembalikan {2}.

Lelaran 2: menggunakan langkah rekursif pada {2}, lalu mengembalikan {3}.

Lelaran 3, 4: mengembalikan {4}, kemudian {5}.

Lelaran 5: WHERE n < 5 adalah palsu apabila n=5, jadi tiada baris dikembalikan. Pertanyaan tamat.

Semua baris yang dikumpulkan — 1, 2, 3, 4, 5 — ialah hasil akhir.

Menyediakan Jadual Hierarki

CTE rekursif sangat sesuai digunakan pada jadual yang merujuk diri sendiri. Mari kita cipta jadual employees yang setiap pekerjanya mempunyai manager_id pilihan yang menunjuk kembali kepada jadual yang sama.

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

INSERT INTO employees VALUES
  (1, 'Alice',   NULL),
  (2, 'Bob',     1),
  (3, 'Carol',   1),
  (4, 'Dave',    2),
  (5, 'Eve',     2),
  (6, 'Frank',   3);

Menelusuri Hierarki

Sekarang kita boleh menelusuri keseluruhan rantaian pelaporan bermula daripada CEO (Alice, id=1). Kes asas memilih Alice; langkah rekursif mencari semua pekerja yang manager_id mereka sepadan dengan id yang sudah terdapat dalam CTE.

Hasilnya merangkumi setiap pekerja yang boleh dicapai daripada Alice, tanpa mengira kedalaman pepohon.

WITH RECURSIVE org_tree AS (
  SELECT id, name, manager_id, 0 AS depth
  FROM employees
  WHERE manager_id IS NULL
  UNION ALL
  SELECT e.id, e.name, e.manager_id, ot.depth + 1
  FROM employees e
  JOIN org_tree ot ON e.manager_id = ot.id
)
SELECT depth, name FROM org_tree ORDER BY depth, name;

Menjejaki Laluan

Satu penambahbaikan biasa ialah membina rentetan laluan yang menunjukkan rantaian penuh dari akar ke setiap nod. Kita menggabungkan nama yang dipisahkan oleh ' -> ' semasa proses rekursi menjadi lebih dalam.

Hal ini memudahkan paparan navigasi berbentuk jejak atau penyahpepijatan hierarki yang dalam.

WITH RECURSIVE org_tree AS (
  SELECT id, name, name AS path
  FROM employees
  WHERE manager_id IS NULL
  UNION ALL
  SELECT e.id, e.name, ot.path || ' -> ' || e.name
  FROM employees e
  JOIN org_tree ot ON e.manager_id = ot.id
)
SELECT name, path FROM org_tree ORDER BY path;

Mengehadkan Kedalaman Rekursi

Data yang sangat dalam atau berkitar boleh menyebabkan CTE rekursif berjalan untuk tempoh yang sangat lama. Dua amalan selamat:

1. Jejaki kedalaman dan tambahkan klausa WHERE — WHERE depth < 10 memastikan anda tidak melebihi 10 peringkat.

2. Gunakan lajur pengesanan kitaran — sesetengah pangkalan data (PostgreSQL 14+) menawarkan sintaks CYCLE untuk mengesan lawatan nod berulang secara automatik.

WITH RECURSIVE org_tree AS (
  SELECT id, name, 0 AS depth
  FROM employees
  WHERE manager_id IS NULL
  UNION ALL
  SELECT e.id, e.name, ot.depth + 1
  FROM employees e
  JOIN org_tree ot ON e.manager_id = ot.id
  WHERE ot.depth < 10
)
SELECT depth, name FROM org_tree;

UNION berbanding UNION ALL dalam CTE Rekursif

Langkah rekursif hampir sentiasa menggunakan UNION ALL, bukannya UNION. Inilah sebabnya:

UNION membuang baris pendua selepas setiap lelaran dengan membandingkan keseluruhan set hasil — proses ini sangat mahal dan boleh mengubah semantik bagi graf yang nod sama dicapai secara sah melalui berbilang laluan.

UNION ALL mengekalkan semua baris tanpa membuang pendua, yang lebih pantas dan betul untuk penelusuran pepohon. Gunakan UNION hanya apabila anda mempunyai keperluan khusus untuk membuang pendua dan memahami kos prestasinya.

Menjana Siri Tarikh

CTE rekursif juga berguna untuk menjana jujukan tarikh. Contoh ini menghasilkan setiap hari dalam satu minggu tertentu — corak yang sering digunakan untuk membina laporan kalendar atau mengisi jurang dalam data siri masa.

WITH RECURSIVE date_series AS (
  SELECT DATE '2024-01-01' AS day
  UNION ALL
  SELECT day + INTERVAL '1 day'
  FROM date_series
  WHERE day < DATE '2024-01-07'
)
SELECT day FROM date_series;

Mencari Semua Orang Bawahan Seorang Pengurus

Anda boleh memulakan kes asas dengan mana-mana nod tertentu — bukan akar sahaja. Di sini kita bermula daripada Bob (id=2) dan mencari semua orang yang melaporkan diri kepadanya secara langsung atau tidak langsung.

Corak ini berguna untuk semakan keizinan, pengagregatan subpepohon atau mengehadkan papan pemuka kepada satu jabatan.

WITH RECURSIVE subordinates AS (
  SELECT id, name
  FROM employees
  WHERE id = 2
  UNION ALL
  SELECT e.id, e.name
  FROM employees e
  JOIN subordinates s ON e.manager_id = s.id
)
SELECT name FROM subordinates;

Semakan Pantas

Uji pemahaman anda tentang cara CTE rekursif berfungsi.

Imbas Kembali Pelajaran

Dalam pelajaran ini, anda telah mempelajari cara CTE rekursif berfungsi:

Struktur: setiap CTE rekursif mempunyai kes asas (baris permulaan) yang dicantumkan dengan langkah rekursif (SELECT yang merujuk kepada dirinya sendiri) menggunakan UNION ALL.

Penamatan: enjin mengulangi langkah rekursif dan mengumpulkan hasil sehingga langkah itu mengembalikan sifar baris.

Kegunaan biasa: menelusuri carta organisasi dan pepohon direktori, menjana jujukan nombor atau tarikh, mengira laluan dan mencari semua nod dalam subpepohon.

Petua keselamatan: sentiasa sertakan syarat penamatan (had kedalaman atau perlindungan kitaran) dan utamakan UNION ALL berbanding UNION untuk prestasi yang lebih baik.

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 “Cara CTE Rekursif Berfungsi” percuma?

Ya — teks penuh “Cara CTE Rekursif Berfungsi” 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 “Cara CTE Rekursif Berfungsi”?

Kes asas ditambah langkah rekursif. 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 1 daripada 4.

Berapa lamakah pelajaran “Cara CTE Rekursif Berfungsi” 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. Cara CTE Rekursif Berfungsi
  2. Menelusuri Pepohon Kategori
  3. Menjana Siri dan Urutan
  4. Mengelakkan Gelung Tanpa Henti
← Kembali ke SQL Academy