Anggota Anchor dan Rekursif
Struktur dua bagian CTE rekursif dan cara penghentiannya bekerja.
Anggota Anchor dan Rekursif adalah pelajaran SQL Interview Prep gratis di CoddyKit. Ini adalah pelajaran 1 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar SQL Interview Prep, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Mengapa CTE Rekursif Sering Muncul
Ketika pewawancara memberikan bagan organisasi, daftar material, atau pohon kategori dan meminta semua turunannya, mereka sedang menguji apakah Anda akan menggunakan CTE rekursif. Penggabungan biasa hanya dapat menelusuri jumlah tingkat yang tetap; rekursi dapat menelusuri kedalaman berapa pun.
Frasa petunjuk dalam pertanyaan biasanya adalah "hingga kedalaman berapa pun" atau "sampai ke bagian paling bawah". Itulah tandanya. Dalam pelajaran ini, Anda akan mempelajari struktur dua bagian yang dimiliki setiap CTE rekursif: bagian awal dan bagian rekursif.
Pola Dasar Dua Bagian
CTE rekursif selalu memiliki kata kunci WITH RECURSIVE (Postgres, SQLite, MySQL 8+; SQL Server menghilangkan RECURSIVE) dan isi yang terdiri dari dua kueri yang digabungkan dengan UNION ALL:
- Bagian awal — baris awal, dijalankan sekali.
- Bagian rekursif — merujuk pada nama CTE itu sendiri, dijalankan berulang kali.
Hafalkan pola dasar ini; pewawancara senang meminta Anda menulisnya dari awal.
WITH RECURSIVE cte AS (
-- anchor member
SELECT ...
UNION ALL
-- recursive member
SELECT ... FROM cte JOIN ...
)
SELECT * FROM cte;Apa yang Dilakukan Bagian Awal
Bagian awal adalah kueri biasa yang tidak merujuk pada CTE. Bagian ini menghasilkan baris awal — titik awal tingkat nol. Untuk bagan organisasi, biasanya bagian ini adalah CEO (baris yang manajernya NULL); untuk deret angka, bagian ini adalah angka pertama.
Bagian awal dijalankan tepat satu kali. Hasilnya menjadi kelompok baris pertama yang diberikan kepada langkah rekursif.
-- Anchor: the top of the hierarchy
SELECT id, name, manager_id, 1 AS depth
FROM employees
WHERE manager_id IS NULLApa yang Dilakukan Bagian Rekursif
Bagian rekursif merujuk pada CTE berdasarkan namanya. Pada setiap iterasi, bagian ini menggabungkan baris yang dihasilkan oleh iterasi sebelumnya dengan tabel dasar untuk menemukan tingkat berikutnya ke bawah.
Bagian ini tidak melihat seluruh isi CTE hingga saat itu — hanya baris yang ditambahkan pada langkah sebelumnya. Inilah model pemahaman utama yang diuji oleh pewawancara.
-- Recursive: children of the rows found so far
SELECT e.id, e.name, e.manager_id, c.depth + 1
FROM employees e
JOIN cte c ON e.manager_id = c.idMenggabungkannya
Gabungkan bagian awal dan bagian rekursif dengan UNION ALL, lalu mesin basis data akan melakukan iterasi secara otomatis. Setiap putaran menambahkan tingkat berikutnya sampai bagian rekursif menghasilkan nol baris, dan pada saat itu rekursi berhenti.
Berikut penelusuran bagan organisasi yang lengkap dan dapat dijalankan, sekaligus melacak depth.
WITH RECURSIVE org AS (
SELECT id, name, manager_id, 1 AS depth
FROM employees
WHERE manager_id IS NULL
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 id, name, depth FROM org ORDER BY depth, id;Cara Rekursi Berhenti
Rekursi berhenti ketika bagian rekursif menghasilkan tidak ada baris baru. Tidak diperlukan penghitung perulangan eksplisit — penggabungan secara alami tidak lagi menghasilkan baris setelah Anda mencapai daun-daun pohon.
Dalam contoh organisasi, ketika Anda mencapai karyawan yang tidak memiliki bawahan langsung, penggabungan pada iterasi berikutnya tidak menemukan anak, menghasilkan keluaran kosong, dan mesin basis data berhenti. Memahami perilaku yang berhenti dengan sendirinya ini merupakan pertanyaan lanjutan klasik.
UNION ALL vs UNION
Pewawancara sering bertanya mengapa kita menggunakan UNION ALL, bukan UNION. Ada dua alasan:
- Kinerja —
UNIONmenghapus duplikasi pada setiap iterasi, dan proses ini mahal. - Ketepatan — dalam sebuah pohon, baris duplikat biasanya tidak dapat muncul, sehingga penghapusan duplikasi hanya membuang pekerjaan.
Gunakan UNION hanya ketika strukturnya berupa graf dan Anda memang ingin menggabungkan simpul yang berulang — tetapi untuk keamanan terhadap siklus, penjagaan eksplisit lebih baik (akan dibahas nanti).
Melacak Kedalaman dan Jalur
Dua kolom tambahan membuat hasil rekursif jauh lebih berguna dan sering diminta dalam wawancara:
- kedalaman — mulai dari 1 pada bagian awal, lalu tambahkan 1 pada bagian rekursif.
- jalur — kumpulkan rangkaian ID atau nama agar Anda dapat melihat rute dari akar ke simpul.
Membangun path sebagai string juga dapat digunakan sebagai alat untuk mendeteksi siklus nantinya.
WITH RECURSIVE org AS (
SELECT id, name, manager_id, 1 AS depth,
CAST(name AS VARCHAR(1000)) AS path
FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id, o.depth + 1,
o.path || ' > ' || e.name
FROM employees e JOIN org o ON e.manager_id = o.id
)
SELECT name, depth, path FROM org;Tipe Kolom Harus Sesuai
Hal yang sering luput diperhatikan: bagian awal dan bagian rekursif harus menghasilkan jumlah kolom yang sama dengan tipe yang kompatibel. Jika Anda membuat string path, nilai awal pada bagian awal harus dikonversi ke ukuran yang cukup besar (misalnya VARCHAR(1000)), atau mesin basis data dapat memotongnya atau menghasilkan galat ketidakcocokan tipe pada iterasi berikutnya.
Inilah jenis detail yang sengaja diberikan pewawancara untuk melihat apakah Anda benar-benar pernah menjalankan CTE rekursif, bukan hanya membacanya.
Contoh Daftar Material
Pola dasar yang sama dapat menyelesaikan daftar material: untuk komponen tertentu, tampilkan setiap subkomponen pada kedalaman berapa pun. Bagian awal memilih rakitan teratas; bagian rekursif menelusuri tautan dari parent_part ke child_part.
Perhatikan bahwa strukturnya identik dengan bagan organisasi — hanya nama kolomnya yang berubah. Menyadari bahwa satu pola dasar dapat digunakan untuk banyak masalah adalah keterampilan wawancara yang sebenarnya.
WITH RECURSIVE bom AS (
SELECT child_part, parent_part, 1 AS lvl
FROM parts WHERE parent_part = 'ENGINE'
UNION ALL
SELECT p.child_part, p.parent_part, b.lvl + 1
FROM parts p JOIN bom b ON p.parent_part = b.child_part
)
SELECT child_part, lvl FROM bom;Catatan Dialek
Lembar contekan singkat lintas dialek yang akan dihargai pewawancara:
- PostgreSQL, SQLite, MySQL 8+:
WITH RECURSIVE name AS (...). - SQL Server: cukup gunakan
WITH name AS (...)— kata kunciRECURSIVEtersirat, dan SQL Server menerapkanMAXRECURSIONbawaan sebesar 100. - Oracle: mendukung CTE rekursif dan sintaks
CONNECT BYyang lebih lama.
Mengatakan "SQL Server tidak menggunakan kata RECURSIVE" menunjukkan pemahaman yang luas.
Pemeriksaan Singkat
Uji pemahaman Anda tentang struktur dua bagian.
Ringkasan
- WITH RECURSIVE + bagian awal +
UNION ALL+ bagian rekursif. - Bagian awal mengisi tingkat nol dan dijalankan sekali.
- Bagian rekursif menggabungkan iterasi sebelumnya dengan tabel dasar dan berjalan sampai tidak menghasilkan baris.
- Gunakan
UNION ALL, lacakdepthdanpath, serta pastikan tipe kolom tetap kompatibel.
Berikutnya: menerapkan pola dasar ini untuk menelusuri bagan organisasi yang nyata ke bawah dan ke atas.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Anggota Anchor dan Rekursif” gratis?
Ya — teks lengkap “Anggota Anchor dan Rekursif” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Interview Prep, upgrade ke CoddyKit PRO. Kursus SQL Interview Prep mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Anggota Anchor dan Rekursif”?
Struktur dua bagian CTE rekursif dan cara penghentiannya bekerja. Kamu berlatih SQL Interview Prep dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai SQL Interview Prep?
Tidak diperlukan pengalaman sebelumnya. SQL Interview Prep di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 1 dari 4.
Berapa lama pelajaran “Anggota Anchor dan Rekursif” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran SQL Interview Prep ini?
Ya. Setiap pelajaran SQL Interview Prep menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Anggota Anchor dan Rekursif
- Menelusuri Bagan Organisasi
- Membuat Deret Angka dan Tanggal
- Menghindari Rekursi Tak Terbatas