İlişkiler ve JOIN
Fan-out ve çift sayma
Doğru çalışan sorgu yanlış rakam üretebilir.
Kavramı anlayalım
Bir-çok JOIN satırları çoğaltır. Sipariş kalemlerine bağladığın SalesOrder tablosunda COUNT(*) artık sipariş sayısı değildir. İki farklı bir-çok tabloyu aynı üst kayda bağlamak daha da büyüyen bir çarpım oluşturabilir. Sorgunun hatasız çalışması ölçünün doğru olduğunu göstermez.
Çözüm, hesaplamak istediğin ölçünün grain’ini korumaktır. Kalem tutarlarını sipariş başına önceden grupla, sonra müşteriye bağla. COUNT(DISTINCT OrderId) sipariş sayısını düzeltebilir, fakat SUM(DISTINCT Amount) eşit tutarlı farklı siparişleri yanlışlıkla birleştirir. DISTINCT bir modelleme ilacı değildir.
Ciro, sipariş sayısı ve ortalama gibi iş ölçülerini JOIN sonrasında doğrularken.
SUM(DISTINCT Total) kullanarak çift saymayı gizlemek.
Aynı konu. Üç farklı derinlik.
SELECT COUNT(*) AS JoinedRows, COUNT(DISTINCT o.OrderId) AS Orders FROM lab.SalesOrder AS o
JOIN lab.OrderItem AS i ON i.OrderId = o.OrderId;18 kalem eşleşmesi, 12 gerçek sipariş.
Bu sayfa SQL çalıştırmaz. Örnekleri indirilebilir SqlStudioLab veritabanında, SSMS’de uygula. Geçici tablo örneklerini yeniden çalıştırırken yalnız ilgili #tabloyu temizle. VIEW, procedure ve function örnekleri lab’da kalıcı nesne oluşturur; üretim bağlantısı kullanma.
Önce kendin dene.
Ödenmiş sipariş sayısını kalem JOIN’i varken doğru hesapla.
Çözümü ve açıklamasını göster
SELECT COUNT(DISTINCT o.OrderId) AS PaidOrders FROM lab.SalesOrder AS o JOIN lab.OrderItem AS i ON i.OrderId = o.OrderId WHERE o.Status = 'Paid';9 döner; COUNT(*) ise 15 ödenmiş kalem döndürür.