Verhalten des Left-Joins in der WHERE-Klausel
In SQL soll ein Left-Join alle Zeilen aus der linken Tabelle einschließen, auch wenn diese vorhanden sind Es gibt keine passenden Zeilen in der rechten Tabelle. Bestimmte Bedingungen können dieses Standardverhalten jedoch ändern.
Betrachten Sie die folgende Abfrage:
SELECT a.foo, b.bar, c.foobar FROM tableOne AS a INNER JOIN tableTwo AS b ON a.pk = b.fk LEFT JOIN tableThree AS c ON b.pk = c.fk WHERE a.foo = 'something' AND c.foobar = 'somethingelse'
In dieser Abfrage wird der linke Join zwischen tableTwo und tableThree aufgrund von effektiv in einen inneren Join umgewandelt die Bedingung in der WHERE-Klausel, c.foobar = 'somethingelse'. Dies liegt daran, dass durch die Angabe eines Nicht-NULL-Werts auf der rechten Seite eines linken Joins (hier „somethingelse“) in der WHERE-Klausel alle Zeilen entfernt werden, in denen die entsprechende Spalte NULL ist, was zu einem inneren Join-Verhalten führt.
Daher gibt die Abfrage nur Zeilen von tableOne und tableTwo zurück, die übereinstimmende Zeilen in tableThree mit einem Wert ungleich NULL für c.foobar haben. Um das gewünschte Left-Join-Verhalten beizubehalten, ziehen Sie die folgenden Lösungen in Betracht:
1. Fügen Sie NULL in die WHERE-Klausel ein:
Ersetzen Sie die Bedingung c.foobar = 'somethingelse' durch AND (c.foobar = 'somethingelse' ODER c.foobar IS NULL), um Zeilen einzuschließen, in denen foobar entweder ' Somethingelse‘ oder NULL.
2. Bedingung in Join-Prädikat verschieben:
Verschieben Sie die Bedingung c.foobar = 'somethingelse' aus der WHERE-Klausel in das Join-Prädikat:
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
Auf diese Weise bleibt die Abfrage erhalten das Left-Join-Verhalten, während weiterhin Zeilen basierend auf dem Wert von c.foobar herausgefiltert werden.
Das obige ist der detaillierte Inhalt vonWie wirkt sich eine WHERE-Klausel auf das Verhalten eines LEFT JOIN in SQL aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!