Der Unterschied zwischen Zustand in Wo und Zustand in Mitglied werden
-
12-09-2019 - |
Frage
Kann jemand mir bitte erklären, warum die folgenden zwei Abfragen zu unterschiedlichen Ergebnissen führen?
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.
Lösung
Die erste erlaubt die Reihenfolge NULL zu sein, weil es eine linke ist beizutreten.
Die zweite nicht, wie sie den Wert der o.OrderType nach dem Join prüfen.
Das Äquivalent wäre (unter der Annahme, Auftragsart kann nicht NULL)
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)
Andere Tipps
Es ist die LEFT JOIN.
Im ersten Fall können Sie weniger Datensätze erhalten, weil nur ein Kunde bis zur WHERE-Bedingung passieren wird, wenn seine Befehle gefiltert werden durch den Cash-Zustand heraus Mitglied werden.
In der zweiten Instanz, kunden um Paare vergehen, und mehr kann nach den WHERE-Filter gelassen werden.
Stellen Sie sicher, Sie wirklich brauchen die LEFT JOIN, und wenn ja, dann sicher, welche dieser beiden Semantik Sie in diesem Fall benötigen.
Eine große Erklärung:
Im ersten Beispiel wird Filterbedingung erste Aufträge von Auftragsart Bargeld filtern aufgetragen und dann mit Kundentabelle verbunden.
Im zweiten Beispiel werden zwei Tabellen verbunden sind, und dann filtriert Zustand aufgetragen wird. Daher wird das Ergebnis unterschiedlich sein.