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

Çoklu JOIN ve satır çoğalması tuzağı

Üç-dört tabloyu zincirlemek ve yanlış toplamları önlemek.

Uygulamada aç, 7 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ç.

Zincirleme JOIN

Müşteri → sipariş → sipariş satırı → ürün yolunu takip edelim:

SELECT c.city,
       p.category,
       ROUND(SUM(oi.quantity * oi.unit_price * (1 - oi.discount)), 2) AS ciro
FROM customers c
JOIN orders o       ON o.customer_id = c.customer_id
JOIN order_items oi ON oi.order_id = o.order_id
JOIN products p     ON p.product_id = oi.product_id
WHERE o.status = 'delivered'
GROUP BY c.city, p.category
ORDER BY ciro DESC
LIMIT 10;

Fan-out: satırların çoğalması

Bire-çok ilişkide JOIN yaptığında “bir” tarafındaki satır “çok” tarafındaki her satır için tekrarlanır. Sipariş tablosunu satırlarıyla birleştirip sipariş sayısını COUNT(*) ile sayarsan, sipariş satırı sayısını bulursun:

SELECT COUNT(*) AS yanlis, COUNT(DISTINCT o.order_id) AS dogru
FROM orders o
JOIN order_items oi ON oi.order_id = o.order_id;
Altın kuralJOIN'den sonra toplam alırken, sonuç tablonun grain düzeyini (tanecik) bil: Her satır neyi temsil ediyor? Bir sipariş mi, bir sipariş satırı mı? Farklı grain düzeyindeki iki tabloyu birleştirmeden önce birini önce özetlemek (alt sorgu/CTE) çoğu zaman doğru yoldur.

Derinleş: grain tablosu

Birleştirdiğin her tablonun bir satırının neyi temsil ettiğini yaz:

TabloBir satır
lk_ordersbir sipariş
lk_order_linesbir siparişteki bir ürün
lk_ratingsbir siparişin değerlendirmesi (0 ya da 1)

Siparişleri satırlarla birleştirince tanecik “sipariş satırı” olur; siparişe ait tutarlar (bahşiş, teslimat ücreti) satır sayısı kadar tekrarlanır. Ya önce satırları sipariş düzeyine topla, ya da siparişe ait tutarları ayrı bir sorguda hesapla.

Alıştırmalara geç (7)