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.

War es hilfreich?

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.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top