Ana içeriğe geç
Kesit SQL
Orta · Tabloları Birleştirme

Self JOIN ve CROSS JOIN

Tabloyu kendisiyle birleştirmek ve tüm kombinasyonları üretmek.

Uygulamada aç, 9 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

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ı

  1. Hiyerarşi: çalışan–yönetici, müşteri–davet eden (lk_customers.referred_by).
  2. Çiftler: aynı ilçedeki restoran çiftleri; tekrarı önlemek için a.id < b.id.
  3. 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;
Alıştırmalara geç (9)