it-swarm.com.de

Filterbedingungsunterschied - Wobei Klausel gegen Beitrittsbedingung

Schnelle einfache Filterfrage.

Was wäre der Unterschied in der Ausgabe oder welche Auswirkungen hätte es, wenn eine Filterbedingung aus einer WHERE-Klausel in die Join-Bedingung verschoben würde?.

Zum Beispiel:

Select a1.Name, a2.State
from student a1
left join location a2 on a1.name_id = a2.name_id
where a1.name LIKE 'A%'
and a2.state = 'New York';

Dazu:

Select a1.Name, a2.State
from student a1
left join location a2 on (a1.name_id = a2.name_id) and a2.state = 'New York'
where a1.name LIKE 'A%';

Vielen Dank an alle.

7
LargeMarge

1) zeigt Schülernamen an, die mit "A" beginnen und deren Standort New York ist.
2) zeigt alle Schülernamen an, die mit "A", "New York" beginnen, wenn der Schülerstaat New York ist, oder in anderen Fällen null (es gibt keinen entsprechenden Staat oder der Studentenstaat ist nicht New York).

Der Unterschied zwischen (1) und (2) - (1) hat keine Nicht-New Yorker Studenten.

8
a1ex07

Antwort von @ a1ex07 ist völlig korrekt. Lassen Sie uns jedoch eine etwas allgemeinere Antwort geben.

Wenn Sie ein TableA a LEFT JOIN TableB b - Szenario haben, müssen Sie vorsichtig sein, wie Sie TableB -Felder in Ihrer WHERE -Klausel verwenden.

Für alle Zeilen in TableA, in denen es keine übereinstimmende Zeile in TableB gibt, werden alle Felder in TableB auf NULL gesetzt.

Schauen wir uns Ihr Beispiel an.

Wir gehen davon aus, dass Sie alle Zeilen von TableA (student) möchten, die entweder keine übereinstimmende Zeile in TableB (location) haben, oder , die eine übereinstimmende Zeile in TableB haben, wobei b.Column1 (location.State) gleich "New York" ist.

  1. Wenn Ihre WHERE -Klausel eine Überprüfung eines TableB -Felds enthält, das keinen NULL-Wert in diesem Feld zulässt, werden alle TableA -Zeilen ohne übereinstimmendes TableB Zeile wird ausgeschlossen.

    Beispiel: WHERE b.State = 'New York' - TableA Zeilen ohne übereinstimmende TableB Zeilen hätten B.Column1 Als NULL. Da NULL = 'New York' Nicht TRUE ist, erfüllt keine der Zeilen TableA (student) ohne übereinstimmende Zeile TableB (location) die Kriterien in der WHERE -Klausel.

    Tatsächlich macht dies den LEFT JOIN Zu einem INNER JOIN.

  2. Wenn Sie zulassen, dass TableB Werte NULL sind, müssen Sie darauf achten, dass Sie nicht mehr Werte als Sie zulassen bedeuten.

    Wenn Sie die obige Beispielklausel WHERE in Folgendes ändern:

    WHERE (b.State = 'New York' OR b.State IS NULL)
    

    Dann sind TableA Zeilen ohne übereinstimmende TableB Zeile weiterhin enthalten. Dies gilt jedoch auch für TableA Zeilen mit einer übereinstimmenden TableB Zeile, wobei Column1 Auf NULL gesetzt ist (in Ihrem Fall student Zeilen mit einer übereinstimmenden location Zeile, wobei location.State NULL ist). Das ist vielleicht nicht die Absicht.

  3. Um unsere vermutete Absicht tatsächlich zu erfüllen, haben Sie mindestens zwei Möglichkeiten:

    • Zunächst können Sie die Einschränkung für TableB Zeilen in der Bedingung JOIN festlegen:

      FROM TableA a
             LEFT JOIN TableB b ON (a.name_id = b.name_id AND b.State = 'New York')
      

      Dies lässt alle TableA (student) Zeilen durch, in denen keine übereinstimmende TableB (location) Zeile vorhanden ist. Wo eine übereinstimmende TableB Zeile ist, werden nur die übereinstimmenden Zeilen von TableA und TableB angezeigt eingeschlossen werden, wenn b.State "New York" ist.

    • Zweitens, fügen Sie Ihre Prüfung in die Klausel WHERE ein, verwenden Sie jedoch die Spalte JOIN in TableB, um NULL-Werte zuzulassen:

      FROM TableA a
             LEFT JOIN TableB b ON (a.name_id = b.name_id)
      WHERE (b.State = 'New York' OR b.name_id IS NULL)
      

      Dies setzt voraus, dass a.name_id Nicht NULL sein kann. Dann kann b.name_id NULL sein, wenn für JOIN in TableB keine Übereinstimmung gefunden wurde. Auch hier sind TableA Zeilen ohne TableB Übereinstimmung enthalten (da b.name_id Für diese Zeilen immer NULL ist). Unter unserer Annahme, dass TableA eine übereinstimmende TableB Zeile hat, wird b.name_id niemals NULL sein , also muss b.State "New York" für dieses TableA und TableB übereinstimmende Paar sein Zeilen enthalten sein.

8
RDFozz