Cara Kerja CTE Rekursif
Kasus dasar ditambah langkah rekursif.
Cara Kerja CTE Rekursif adalah pelajaran SQL Academy 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 Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus SQL Academy mencakup 4 pelajaran total.
Apa Itu CTE Rekursif
CTE rekursif adalah Common Table Expression yang merujuk pada dirinya sendiri. CTE ini memungkinkan Anda menulis kueri yang mengulangi suatu langkah hingga syarat terpenuhi — mirip dengan perulangan, tetapi dinyatakan sebagai SQL murni.
CTE rekursif didefinisikan dengan kata kunci WITH RECURSIVE dan ideal untuk menelusuri data hierarkis atau menyerupai graf, seperti bagan organisasi, pohon folder, dan struktur daftar material.
Struktur Dua Bagian
Setiap CTE rekursif memiliki tepat dua bagian yang dipisahkan oleh UNION ALL:
1. Kasus dasar — SELECT nonrekursif yang mengembalikan baris awal.
2. Langkah rekursif — SELECT yang menggabungkan kembali CTE dengan dirinya sendiri dan menghasilkan baris pada tingkat berikutnya.
Mesin terus menjalankan langkah rekursif dan mengakumulasikan hasil hingga tidak ada baris baru yang 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;Menghitung dari 1 hingga 5
CTE rekursif paling sederhana digunakan untuk menghitung bilangan. Kasus dasar menginisialisasi nilai 1. Langkah rekursif menambahkan 1 pada setiap iterasi. Klausa WHERE di dalam langkah rekursif berfungsi sebagai kondisi penghentian — tanpa klausa tersebut, kueri akan berjalan selamanya.
WITH RECURSIVE counter(n) AS (
SELECT 1
UNION ALL
SELECT n + 1 FROM counter WHERE n < 5
)
SELECT n FROM counter;Eksekusi Langkah demi Langkah
Berikut cara mesin memproses CTE penghitung pada setiap iterasi:
Iterasi 0 (kasus dasar): menghasilkan {1}.
Iterasi 1: menerapkan langkah rekursif pada {1}, lalu menghasilkan {2}.
Iterasi 2: menerapkan langkah rekursif pada {2}, lalu menghasilkan {3}.
Iterasi 3, 4: menghasilkan {4}, lalu {5}.
Iterasi 5: WHERE n < 5 bernilai salah untuk n=5, sehingga tidak ada baris yang dihasilkan. Kueri berakhir.
Semua baris yang terakumulasi — 1, 2, 3, 4, 5 — menjadi hasil akhir.
Menyiapkan Tabel Hierarki
CTE rekursif sangat berguna pada tabel yang merujuk dirinya sendiri. Mari buat tabel employees yang setiap karyawannya memiliki manager_id opsional yang merujuk kembali ke tabel 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 dapat menelusuri seluruh rantai pelaporan mulai dari CEO (Alice, id=1). Kasus dasar memilih Alice; langkah rekursif menemukan semua karyawan yang manager_id-nya cocok dengan id yang sudah ada di CTE.
Hasilnya mencakup setiap karyawan yang dapat dicapai dari Alice, sedalam apa pun pohonnya.
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;Melacak Jalur
Peningkatan yang umum dilakukan adalah membangun teks jalur yang menampilkan seluruh rantai dari akar ke setiap simpul. Kita menggabungkan nama-nama yang dipisahkan oleh ' -> ' saat melakukan rekursi ke tingkat yang lebih dalam.
Dengan demikian, navigasi bergaya remah roti atau penelusuran kesalahan pada hierarki yang dalam menjadi lebih mudah ditampilkan.
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;Membatasi Kedalaman Rekursi
Data yang dalam atau melingkar dapat membuat CTE rekursif berjalan sangat lama. Dua praktik yang aman:
1. Lacak kedalaman dan tambahkan klausa WHERE — WHERE depth < 10 memastikan Anda tidak pernah melewati 10 tingkat.
2. Gunakan kolom pendeteksi siklus — beberapa basis data (PostgreSQL 14+) menyediakan sintaks CYCLE untuk mendeteksi kunjungan berulang ke simpul secara otomatis.
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 vs UNION ALL dalam CTE Rekursif
Langkah rekursif hampir selalu menggunakan UNION ALL, bukan UNION. Berikut alasannya:
UNION menghapus duplikasi baris setelah setiap iterasi dengan membandingkan seluruh kumpulan hasil — hal ini sangat mahal dan dapat mengubah makna pada graf ketika simpul yang sama memang dapat dicapai melalui beberapa jalur.
UNION ALL mempertahankan semua baris tanpa menghapus duplikasi, sehingga lebih cepat dan tepat untuk penelusuran pohon. Gunakan UNION hanya jika Anda memiliki kebutuhan khusus untuk menghapus duplikasi dan memahami biaya kinerjanya.
Membuat Deret Tanggal
CTE rekursif juga berguna untuk membuat rangkaian tanggal. Contoh ini menghasilkan setiap hari dalam satu minggu tertentu — pola yang sering digunakan untuk membuat laporan kalender atau mengisi celah dalam data deret waktu.
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;Menemukan Semua Bawahan Satu Manajer
Anda dapat mengawali kasus dasar dengan simpul tertentu — bukan hanya simpul akar. Di sini kita mulai dari Bob (id=2) dan menemukan semua orang yang melapor kepadanya, baik secara langsung maupun tidak langsung.
Pola ini berguna untuk pemeriksaan izin, agregasi subpohon, atau membatasi cakupan dasbor ke satu departemen.
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;Pemeriksaan Singkat
Uji pemahaman Anda tentang cara kerja CTE rekursif.
Ringkasan Pelajaran
Dalam pelajaran ini, Anda mempelajari cara kerja CTE rekursif:
Struktur: setiap CTE rekursif memiliki kasus dasar (baris awal) yang digabungkan dengan langkah rekursif (SELECT yang merujuk dirinya sendiri) menggunakan UNION ALL.
Penghentian: mesin mengulangi langkah rekursif dan mengakumulasikan hasil hingga langkah tersebut menghasilkan nol baris.
Penggunaan umum: menelusuri bagan organisasi dan pohon folder, membuat deret angka atau tanggal, menghitung jalur, serta menemukan semua simpul dalam subpohon.
Tips keamanan: selalu sertakan kondisi penghentian (batas kedalaman atau penjagaan siklus), dan utamakan UNION ALL daripada UNION demi kinerja.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Cara Kerja CTE Rekursif” gratis?
Ya — teks lengkap “Cara Kerja CTE Rekursif” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus SQL Academy, upgrade ke CoddyKit PRO. Kursus SQL Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Cara Kerja CTE Rekursif”?
Kasus dasar ditambah langkah rekursif. Kamu berlatih SQL Academy 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 Academy?
Tidak diperlukan pengalaman sebelumnya. SQL Academy 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 “Cara Kerja CTE 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 Academy ini?
Ya. Setiap pelajaran SQL Academy 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
- Cara Kerja CTE Rekursif
- Menelusuri Pohon Kategori
- Membuat Deret dan Urutan
- Menghindari Perulangan Tak Terbatas