Heim > Datenbank > MySQL-Tutorial > Left Joins und WHERE-Klauseln: Wie interagieren sie und wie kann ich unerwartete Ergebnisse vermeiden?

Left Joins und WHERE-Klauseln: Wie interagieren sie und wie kann ich unerwartete Ergebnisse vermeiden?

DDD
Freigeben: 2024-12-31 18:05:12
Original
993 Leute haben es durchsucht

Left Joins and WHERE Clauses: How Do They Interact, and How Can I Avoid Unexpected Results?

Die Besonderheiten von Left Joins und WHERE-Klauseln

Bei der Durchführung von Datenabrufvorgängen verwenden Entwickler häufig Left Joins, um Informationen aus mehreren Tabellen zu kombinieren. Bei der Verwendung einer WHERE-Klausel in Verbindung mit einem Left-Join entsteht jedoch eine häufige Gefahr, die möglicherweise das Verhalten des Left-Joins verändert.

Betrachten 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

Intuitiv würde man das tun Erwarten Sie, dass diese Anweisung eine Linksverknüpfung zwischen tableThree und tableTwo durchführt und eine Filterbedingung für c.foobar angibt. Das Vorhandensein der WHERE-Klausel mit c.foobar = 'somethingelse' ändert jedoch versehentlich die Eigenschaften des linken Joins.

Wenn ein Wert von der rechten Seite eines linken Joins (in diesem Fall c.foobar) ist In der WHERE-Klausel enthalten, werden nur Zeilen in die Ergebnismenge aufgenommen, deren Wert NICHT NULL ist. Somit verhält sich der linke Join effektiv wie ein innerer Join und eliminiert alle Zeilen mit NULL-Werten für c.foobar.

Um das beabsichtigte Verhalten des linken Joins im obigen Beispiel beizubehalten, kann man eine der folgenden Methoden anwenden Ansätze:

  • WHERE-Klausel neu schreiben: Ersetzen Sie c.foobar = 'somethingelse' durch eine Bedingung, die dies zulässt NULL-Werte wie AND (c.foobar = 'somethingelse' OR c.foobar IS NULL).
  • Verschieben Sie den Filter in das Join-Prädikat:Ändern Sie die LEFT JOIN-Klausel wie folgt: LEFT JOIN tableThree AS c ON b.pk = c.fk AND c.foobar = 'somethingelse'. Durch die Platzierung des Filters innerhalb des Joins selbst bleibt das Verhalten des linken Joins unverändert, da NULL-Werte in c.foobar weiterhin erhalten bleiben.

Das obige ist der detaillierte Inhalt vonLeft Joins und WHERE-Klauseln: Wie interagieren sie und wie kann ich unerwartete Ergebnisse vermeiden?. 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