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';
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:
AND (c.foobar = 'somethingelse' OR c.foobar IS NULL)
LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'
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!