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?

Warum wird ein LEFT JOIN zu einem INNER JOIN, wenn in der WHERE-Klausel nach einer Spalte auf der rechten Seite gefiltert wird?

DDD
DDDOriginal
2024-12-29 14:47:11745Durchsuche

Why Does a LEFT JOIN Become an INNER JOIN When Filtering on a Right-Side Column in the WHERE Clause?

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:

  1. WHERE ändern Klausel:
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.

  1. Move to Join Predicate :
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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn