Heim >Datenbank >MySQL-Tutorial >Warum wird ein LEFT JOIN zu einem INNER JOIN, wenn in der WHERE-Klausel nach einer Spalte auf der rechten Seite gefiltert wird?
Linke-Join-Verhaltensfrage: Umwandlung in Inner-Join mit WHERE-Klausel
Bedenken Sie die folgende SQL-Anweisung:
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 diesem Szenario wird ein Left-Join-Verhalten erwartet. Das beobachtete Verhalten besteht jedoch darin, dass sich der linke Join aufgrund des Vorhandenseins der AND c.foobar = 'somethingelse'-Klausel in einen inneren Join zu verwandeln scheint. Zeilen, denen ein entsprechender „somethingelse“-Wert in tableThree fehlt, werden nicht zurückgegeben.
Verstehen des Verhaltens
Der Schlüssel liegt in der Interaktion zwischen der WHERE-Klausel und dem LEFT JOIN . Wenn ein Nicht-NULL-Wert auf der rechten Seite eines linken Joins in einer WHERE-Klausel angegeben wird, werden die NULL-Werte eliminiert, wodurch der Join effektiv in einen inneren Join umgewandelt wird.
In diesem Fall ist das AND c. foobar = 'somethingelse'-Klausel filtert Zeilen aus tableThree heraus, wobei foobar NULL ist. Dies bedeutet, dass nur Zeilen mit übereinstimmenden Nicht-NULL-Werten in tableTwo und tableThree zurückgegeben werden.
Lösungen
Um dieses Verhalten zu beheben und den beabsichtigten linken Join wiederherzustellen, klicken Sie hier Es gibt zwei Möglichkeiten:
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
Dieser Zusatz ermöglicht die Einbeziehung von NULL-Werten aus tableThree, wobei das Left-Join-Verhalten erhalten bleibt.
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
Durch Verschieben der c.foobar-Bedingung in den Join Prädikat gibt die Abfrage explizit die gewünschten Filterkriterien innerhalb der Verknüpfung an und stellt so sicher, dass nur übereinstimmende Zeilen verknüpft werden.
Das obige ist der detaillierte Inhalt vonWarum wird ein LEFT JOIN zu einem INNER JOIN, wenn in der WHERE-Klausel nach einer Spalte auf der rechten Seite gefiltert wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!