2009-07-10 17 views
2

Kann mir bitte jemand erklären, warum die folgenden zwei Abfragen zu unterschiedlichen Ergebnissen führen?Unterschied zwischen Bedingung in Where und Bedingung in Join

SELECT 
    o.* 
FROM 
    Customer c 
LEFT JOIN 
    [Order] o ON o.CustomerID = c.CustomerID AND o.OrderType = 'Cash' 
WHERE 
    c.Country = 'USA' 

SELECT 
    o.* 
FROM 
    Customer c 
LEFT JOIN 
    [Order] o ON o.CustomerID = c.CustomerID 
WHERE 
    c.Country = 'USA' 
AND 
    o.OrderType = 'Cash' 

Danke.

Antwort

5

Der erste erlaubt die Reihenfolge, um NULL zu sein, da es eine linke Verknüpfung ist.
Die zweite nicht, da es den Wert von o.OrderType nach dem Join überprüft.

Das Äquivalent würde (vorausgesetzt, Auftragsart kann nicht NULL sein)

SELECT 
    o.* 
FROM 
    Customer c 
LEFT JOIN 
    [Order] o ON o.CustomerID = c.CustomerID 
WHERE 
    c.Country = 'USA' 
AND 
    (o.OrderType = 'Cash' OR o.OrderType IS NULL) 
+0

Das macht Sinn, danke Greg. * Eureka Moment * – staterium

0

Es ist der LEFT JOIN.

In der ersten Instanz können Sie weniger Datensätze erhalten, da nur ein Kunde die WHERE-Bedingung durchläuft, wenn seine Bestellungen durch die Cash-Bedingung in Join herausgefiltert werden.

In der zweiten Instanz werden mehr Kunden-Auftrag-Paare übergeben, und nach den WHERE-Filtern können weitere übrig bleiben.

Stellen Sie sicher, dass Sie wirklich den LINKEN JOIN benötigen, und wenn ja, dann stellen Sie sicher, welche dieser beiden Semantiken Sie in diesem Fall benötigen.

0

Im ersten Beispiel wird Filterbedingung zuerst angewandt Aufträge von Auftragsart Bargeld zu filtern und dann mit Kundentabelle verbunden.

Im zweiten Beispiel werden zwei Tabellen verbunden und dann wird die Filterbedingung angewendet. Daher wird das Ergebnis anders sein.