Heim > Datenbank > MySQL-Tutorial > Warum verhält sich mein linker Join wie ein innerer Join, wenn in der WHERE-Klausel nach der Spalte der rechten Tabelle gefiltert wird?

Warum verhält sich mein linker Join wie ein innerer Join, wenn in der WHERE-Klausel nach der Spalte der rechten Tabelle gefiltert wird?

DDD
Freigeben: 2024-12-30 03:08:10
Original
795 Leute haben es durchsucht

Why Does My Left Join Act Like an Inner Join When Filtering on the Right Table's Column in the WHERE Clause?

Left-Join-Rätsel: Geisterstunden, wenn daraus ein Inner-Join wird

Im Bereich eines Datenbank-Assistenten ist die Durchführung komplexer Datenabrufe mithilfe von Left-Joins eine gängige Praxis. Manchmal verhält sich der linke Join jedoch nicht ganz wie erwartet.

Stellen Sie sich die folgende Abfrage vor:

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

Interessanterweise, wenn die c.foobar-Bedingung in die WHERE-Klausel als eingefügt wird Oben scheint sich der vermeintlich linke Join in einen inneren Join zu verwandeln. Ergebnisse werden nur zurückgegeben, wenn sowohl die a.foo- als auch die c.foobar-Kriterien erfüllt sind.

Warum die Metamorphose? Der Schlüssel liegt in der WHERE-Klausel. Wenn in der WHERE-Klausel ein Wert von der rechten Seite eines linken Joins (die rechte Seite bezieht sich auf die Tabelle auf der rechten Seite der ON-Klausel) angegeben wird, werden alle NULL-Werte verworfen, wodurch der linke Join effektiv auf einen inneren Join reduziert wird. Einfach ausgedrückt: Wenn c.foobar in tableThree nicht vorhanden ist, gibt die Abfrage keine Zeilen zurück.

Um dieses Dilemma zu umgehen, gibt es zwei Optionen:

  1. Ändern Sie die zu berücksichtigende WHERE-Klausel Sowohl gültige als auch NULL-Werte für c.foobar:
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
Nach dem Login kopieren
  1. Verschieben Sie die c.foobar-Bedingung in das Join-Prädikat:
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
Nach dem Login kopieren

Die Wahl zwischen diesen Lösungen hängt von den spezifischen Anforderungen der Abfrage ab. Für die Beherrschung der Datenabruftechniken ist es jedoch von entscheidender Bedeutung, das zugrunde liegende Verhalten von Left Joins bei Vorhandensein von WHERE-Klauseln zu verstehen.

Das obige ist der detaillierte Inhalt vonWarum verhält sich mein linker Join wie ein innerer Join, wenn in der WHERE-Klausel nach der Spalte der rechten Tabelle 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