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
Freigeben: 2024-12-29 14:47:11
Original
751 Leute haben es durchsucht

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'
Nach dem Login kopieren

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)
Nach dem Login kopieren

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'
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage