Self join: çalışan ve yöneticisi
Aynı tabloyu iki farklı takma adla iki kez kullanırsın:
SELECT e.first_name || ' ' || e.last_name AS calisan,
m.first_name || ' ' || m.last_name AS yonetici
FROM employees e
LEFT JOIN employees m ON e.manager_id = m.emp_id;
Self join ayrıca aynı tablodaki satırları karşılaştırmak için de kullanılır: aynı şehirde yaşayan müşteri çiftleri, aynı gün iki sipariş veren müşteriler gibi.
CROSS JOIN: kartezyen çarpım
Her satırı diğer tablonun her satırıyla eşleştirir. 7 departman × 3 kanal = 21 satır.
SELECT d.name, ch.channel FROM departments d CROSS JOIN (SELECT DISTINCT channel FROM orders) ch;
Raporlarda “her ay × her kategori” iskeleti oluşturup boş kombinasyonları 0 ile göstermek için çok kullanılır.
Kazara kartezyenJOIN koşulunu unutmak (veya yanlış yazmak) satır sayısını patlatır: 1 milyon × 1 milyon = 1 trilyon satır. Sonuç beklenmedik şekilde büyükse ilk şüphelin bu olsun.
Derinleş: kendine birleştirmenin üç kalıbı
- Hiyerarşi: çalışan–yönetici, müşteri–davet eden (
lk_customers.referred_by). - Çiftler: aynı ilçedeki restoran çiftleri; tekrarı önlemek için
a.id < b.id. - Sıralı olaylar: aynı uçağın art arda uçuşları; bugün çoğunlukla LAG/LEAD ile yazılır.
SELECT d.full_name AS davet_eden, COUNT(*) AS davetli FROM lk_customers c JOIN lk_customers d ON d.customer_id = c.referred_by GROUP BY d.customer_id, d.full_name ORDER BY davetli DESC LIMIT 5;