0Pricing
SQL Academy · Pelajaran

Batasan Self JOIN

Saat Anda justru memerlukan rekursi.

Batasan Self JOIN adalah pelajaran SQL Academy gratis di CoddyKit. Ini adalah pelajaran 4 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 Penggabungan Mandiri

Penggabungan mandiri terjadi saat sebuah tabel digabungkan dengan dirinya sendiri. Teknik ini berguna untuk membandingkan baris dalam tabel yang sama, misalnya untuk menemukan karyawan dan manajer mereka yang disimpan dalam satu tabel employees.

Sebelum membahas keterbatasannya, mari kita ingat kembali cara kerja penggabungan mandiri dasar dalam praktik.

SELECT e.name AS employee, m.name AS manager
FROM employees e
JOIN employees m ON e.manager_id = m.id;

Satu Tingkat

Penggabungan mandiri menangani satu lompatan dalam hierarki dengan elegan. Jika Anda ingin memasangkan setiap karyawan dengan manajer langsungnya, satu penggabungan mandiri sudah cukup.

Teknik ini bekerja sempurna saat data Anda hanya memiliki satu tingkat atau saat Anda hanya memperhatikan hubungan induk-anak langsung.

SELECT child.name AS employee, parent.name AS direct_manager
FROM employees child
LEFT JOIN employees parent ON child.manager_id = parent.id;

Dua Tingkat: Mulai Rumit

Bagaimana jika Anda memerlukan karyawan, manajer mereka, dan manajer dari manajer mereka? Anda harus menambahkan penggabungan mandiri kedua. Kuerinya menjadi lebih panjang dan lebih sulit dibaca.

Setiap tingkat hierarki tambahan memerlukan satu alias penggabungan lagi dan satu klausa JOIN tambahan.

SELECT e.name AS employee,
       m.name AS manager,
       gm.name AS grand_manager
FROM employees e
LEFT JOIN employees m  ON e.manager_id = m.id
LEFT JOIN employees gm ON m.manager_id = gm.id;

Tiga Tingkat: Polanya Mulai Tidak Efektif

Penambahan tingkat ketiga memaksa Anda menambahkan penggabungan lagi. Pada tahap ini, kuerinya sudah bertele-tele, rapuh, dan sulit dipelihara. Jika kedalaman hierarki berubah, Anda harus menulis ulang seluruh kueri.

Inilah keterbatasan utama penggabungan mandiri: teknik ini tidak dapat berkembang mengikuti kedalaman.

SELECT e.name AS employee,
       m.name AS manager,
       gm.name AS grand_manager,
       ggm.name AS great_grand_manager
FROM employees e
LEFT JOIN employees m   ON e.manager_id = m.id
LEFT JOIN employees gm  ON m.manager_id = gm.id
LEFT JOIN employees ggm ON gm.manager_id = ggm.id;

Kedalaman Tidak Diketahui: Penggabungan Mandiri Tidak Dapat Membantu

Dalam bagan organisasi atau pohon kategori di dunia nyata, kedalamannya sering kali tidak diketahui saat kueri dijalankan. Penggabungan mandiri mengharuskan Anda menetapkan jumlah tingkat secara langsung. Jika besok hierarkinya memiliki kedalaman 10 tingkat, kueri penggabungan mandiri 3 tingkat Anda akan melewatkan data secara diam-diam.

Ini adalah keterbatasan mendasar: penggabungan mandiri tidak dapat menelusuri jumlah tingkat yang sembarang.

-- This only retrieves up to 3 levels deep.
-- Employees deeper than level 3 are simply missing from results.
SELECT e.name, m.name, gm.name
FROM employees e
LEFT JOIN employees m  ON e.manager_id = m.id
LEFT JOIN employees gm ON m.manager_id = gm.id;

Siklus Membuat Penggabungan Mandiri Gagal Sepenuhnya

Keterbatasan serius lainnya: jika data berisi siklus (A mengelola B, B mengelola C, C mengelola A), kueri penggabungan mandiri tidak akan melakukan perulangan tanpa akhir, tetapi juga tidak dapat mendeteksi atau melaporkan siklus tersebut dengan benar.

Anda tidak dapat mencegah referensi melingkar hanya dengan penggabungan mandiri biasa. Kueri rekursif memiliki mekanisme bawaan untuk mendeteksi siklus, yang sama sekali tidak dimiliki penggabungan mandiri.

-- Cyclic data: row 3 points back to row 1
-- id | name    | manager_id
--  1 | Alice   | 3   <-- cycle!
--  2 | Bob     | 1
--  3 | Charlie | 2

-- A self join just shows one hop; it cannot detect the loop
SELECT e.name, m.name AS reports_to
FROM employees e
JOIN employees m ON e.manager_id = m.id;

Memperkenalkan CTE Rekursif

SQL menyediakan solusi khusus untuk menelusuri hierarki dengan kedalaman yang tidak diketahui: Common Table Expression (CTE) rekursif. Solusi ini menggunakan sintaks WITH RECURSIVE yang didukung oleh PostgreSQL, MySQL 8+, SQLite, dan SQL Server.

CTE rekursif memiliki dua bagian: anggota jangkar (baris awal) dan anggota rekursif (langkah yang mengikuti setiap hubungan).

WITH RECURSIVE org_tree AS (
  -- Anchor: start with the top-level CEO (no manager)
  SELECT id, name, manager_id, 1 AS depth
  FROM employees
  WHERE manager_id IS NULL

  UNION ALL

  -- Recursive: find each employee whose manager is already in org_tree
  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 name, depth FROM org_tree ORDER BY depth;

Melacak Jalur Lengkap

Salah satu fitur CTE rekursif yang sangat berguna adalah kemampuan untuk mengakumulasi konteks saat Anda menuruni hierarki. Misalnya, Anda dapat membangun jalur lengkap dari akar ke setiap simpul — sesuatu yang sama sekali tidak mungkin dilakukan dengan penggabungan mandiri statis.

WITH RECURSIVE org_tree AS (
  SELECT id, name, manager_id,
         name AS path
  FROM employees
  WHERE manager_id IS NULL

  UNION ALL

  SELECT e.id, e.name, e.manager_id,
         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;

Penggabungan Mandiri vs CTE Rekursif: Kapan Memilihnya

Gunakan penggabungan mandiri jika:

  • Anda memerlukan tepat satu atau dua tingkat hierarki.
  • Kedalamannya tetap dan sudah diketahui sebelumnya.
  • Anda menginginkan kesederhanaan tanpa beban tambahan CTE.

Gunakan CTE rekursif jika:

  • Kedalamannya berubah-ubah atau tidak diketahui.
  • Anda memerlukan jalur lengkap leluhur atau keturunan.
  • Anda menginginkan deteksi siklus melalui klausa CYCLE atau penjagaan manual.

Pertimbangan Kinerja

Penggabungan mandiri pada kolom yang terindeks sangat cepat untuk kueri dengan kedalaman tetap. Setiap penggabungan merupakan satu pencarian, dan pengoptimal basis data dapat menanganinya dengan baik.

CTE rekursif lebih fleksibel, tetapi dapat membebani kinerja pada pohon yang dalam atau lebar. Selalu tambahkan penjagaan batas kedalaman pada anggota rekursif untuk mencegah kueri berjalan tanpa kendali akibat data yang buruk atau siklus yang tidak terduga.

WITH RECURSIVE org_tree 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, ot.depth + 1
  FROM employees e
  JOIN org_tree ot ON e.manager_id = ot.id
  WHERE ot.depth < 10   -- safety guard: stop at depth 10
)
SELECT name, depth FROM org_tree;

Kasus Penggunaan Nyata yang Memerlukan Rekursi

Banyak model data umum memerlukan penelusuran dengan kedalaman sembarang yang tidak dapat ditangani oleh penggabungan mandiri:

  • Pohon kategori — kategori produk bertingkat dalam katalog perdagangan elektronik.
  • Daftar material — produk yang tersusun dari berbagai komponen, dan setiap komponen tersusun dari subkomponen.
  • Utas komentar — balasan terhadap balasan terhadap balasan.
  • Jalur sistem berkas — direktori di dalam direktori.

Dalam semua kasus ini, gunakan CTE rekursif daripada menumpuk penggabungan mandiri.

WITH RECURSIVE category_tree AS (
  SELECT id, name, parent_id, name AS full_path
  FROM categories
  WHERE parent_id IS NULL

  UNION ALL

  SELECT c.id, c.name, c.parent_id,
         ct.full_path || ' / ' || c.name
  FROM categories c
  JOIN category_tree ct ON c.parent_id = ct.id
)
SELECT id, name, full_path FROM category_tree ORDER BY full_path;

Uji Pemahaman

Uji pemahaman Anda tentang keterbatasan penggabungan mandiri dan kapan harus menggunakan CTE rekursif sebagai gantinya.

Ringkasan Pelajaran

Dalam pelajaran ini, Anda mempelajari keterbatasan penggabungan mandiri untuk data hierarkis:

  • Penggabungan mandiri bekerja dengan baik untuk satu atau dua tingkat tetap dalam hierarki.
  • Setiap tingkat tambahan memerlukan JOIN eksplisit lainnya, sehingga kueri menjadi rapuh dan sulit dipelihara.
  • Penggabungan mandiri tidak dapat menangani kedalaman yang tidak diketahui — baris di luar tingkat yang ditetapkan secara langsung akan dikecualikan tanpa pemberitahuan.
  • Teknik ini tidak memberikan perlindungan terhadap referensi siklik dalam data.
  • Saat kedalamannya berubah-ubah atau tidak diketahui, gunakan CTE rekursif (WITH RECURSIVE) sebagai gantinya.
  • Selalu tambahkan penjagaan kedalaman dalam kueri rekursif untuk melindungi dari eksekusi tanpa kendali.

Mengetahui kapan harus beralih dari penggabungan mandiri ke CTE rekursif adalah keterampilan penting untuk menguerikan data apa pun yang terstruktur sebagai pohon dalam SQL.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Batasan Self JOIN” gratis?

Ya — teks lengkap “Batasan Self JOIN” 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 “Batasan Self JOIN”?

Saat Anda justru memerlukan rekursi. 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 4 dari 4.

Berapa lama pelajaran “Batasan Self JOIN” 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

  1. Apa Itu Self JOIN
  2. Karyawan dan Manajer
  3. Membandingkan Baris dalam Tabel yang Sama
  4. Batasan Self JOIN
← Kembali ke SQL Academy