Self JOIN & CROSS JOIN: Tabel yang Berhubungan dengan Dirinya Sendiri
Menggabungkan tabel dengan dirinya sendiri untuk struktur atasan–bawahan, memakai alias berbeda, dan mengenal CROSS JOIN untuk membuat semua kombinasi.
Ketika sebuah tabel menunjuk dirinya sendiri
Lihat tabel karyawan berikut. Kolom atasan_id berisi id karyawan lain di tabel yang sama:
| id | nama | jabatan | atasan_id |
|---|---|---|---|
| 1 | Rina Wijaya | Direktur | NULL |
| 2 | Bagas Prakoso | Manajer Operasional | 1 |
| 4 | Dimas Anggara | Barista | 2 |
Dimas atasannya Bagas (id 2); Bagas atasannya Rina (id 1); Rina tidak punya atasan (NULL). Untuk menampilkan nama atasan, kita JOIN tabel itu dengan dirinya sendiri. Triknya: beri dua alias berbeda pada tabel yang sama, seolah-olah dua tabel terpisah.
SELECT k.nama AS karyawan,
a.nama AS atasan
FROM karyawan k
LEFT JOIN karyawan a ON a.id = k.atasan_id;
k= peran sebagai "karyawan" (anak),a= peran sebagai "atasan" (induk).- Kondisi: id atasan (
a.id) sama dengan atasan_id si karyawan (k.atasan_id). - Kenapa
LEFT? Rina tidak punya atasan; dengan INNER JOIN ia akan hilang dari daftar.
+----------------+---------------+
| karyawan | atasan |
+----------------+---------------+
| Rina Wijaya | NULL |
| Bagas Prakoso | Rina Wijaya |
| Citra Dewi | Rina Wijaya |
| Dimas Anggara | Bagas Prakoso |
...
Pola ini dipakai untuk: struktur organisasi, kategori bersarang (kategori induk–anak), komentar yang dibalas komentar lain, dan silsilah keluarga.
Contoh lain: mencari pasangan dalam satu tabel
-- pasangan karyawan yang gajinya sama (tanpa pasangan dengan dirinya sendiri / duplikat terbalik)
SELECT a.nama, b.nama, a.gaji
FROM karyawan a
JOIN karyawan b ON a.gaji = b.gaji AND a.id < b.id;
CROSS JOIN: semua kemungkinan kombinasi
SELECT p.nama AS produk, u.ukuran
FROM produk p
CROSS JOIN (SELECT 'S' AS ukuran UNION SELECT 'M' UNION SELECT 'L') u;
CROSS JOIN memasangkan setiap baris kiri dengan setiap baris kanan (hasil = m × n baris). Tidak ada ON. Berguna untuk membuat kombinasi (produk × ukuran, tanggal × cabang), tetapi pada tabel besar bisa meledak, jadi pakailah dengan sengaja.
Cross join yang tidak disengaja terjadi saat kamu lupa kondisi ON atau menulis FROM a, b tanpa WHERE: tabel 10.000 × 10.000 baris menghasilkan 100 juta baris dan bisa melumpuhkan server.