Effektiv, WHERE
Bedingungen und JOIN
Bedingungen für [INNER] JOIN
sind in PostgreSQL zu 100 % äquivalent. (Es hat sich bewährt, explizit JOIN
zu verwenden Bedingungen, um Abfragen leichter lesbar und pflegeleichter zu machen).
Dasselbe ist nicht wahr für einen LEFT JOIN
kombiniert mit einem WHERE
Bedingung in einer Tabelle rechts vom Join. Der Zweck eines LEFT JOIN
besteht darin, alle Zeilen auf der linken Seite des Joins beizubehalten, unabhängig von einer Übereinstimmung auf der rechten Seite. Wenn keine Übereinstimmung gefunden wird, wird die Zeile um NULL
erweitert Werte für Spalten auf der rechten Seite. Das Handbuch:
LEFT OUTER JOIN
Zuerst wird ein Inner Join durchgeführt. Dann wird für jede Zeile in T1, die die Verknüpfungsbedingung mit keiner Zeile in T2 erfüllt, eine verknüpfte Zeile mit Nullwerten in den Spalten von T2 hinzugefügt. Somit hat die verbundene Tabelle immer mindestens eine Zeile für jede Zeile in T1.
Wenn Sie dann ein WHERE
anwenden Bedingung, die etwas anderes als NULL
erfordert Wert auf Tabellenspalten auf der rechten Seite, heben Sie den Effekt auf und konvertieren zwangsweise den LEFT [OUTER] JOIN
um wie ein einfacher [INNER] JOIN
zu funktionieren , nur (möglicherweise) teurer aufgrund eines komplizierteren Abfrageplans.
In einer Abfrage mit vielen verknüpften Tabellen ist es für Postgres (oder jedes RDBMS) schwierig, den besten (oder sogar einen guten) Abfrageplan zu finden. Die Anzahl der theoretisch möglichen Sequenzen zum Verbinden von Tabellen wächst faktoriell (!). Postgres verwendet den "Generic Query Optimizer" für die Aufgabe und es gibt einige Einstellungen, um ihn zu beeinflussen.
Verschleierung der Abfrage mit irreführendem LEFT JOIN
wie skizziert, erschwert die Arbeit des Abfrageplaners, ist für menschliche Leser irreführend und weist typischerweise auf Fehler in der Abfragelogik hin.
Verwandte Antworten auf daraus resultierende Probleme:
- Warum ist null gleich Ganzzahl in WO?
- Abfrage mit LEFT JOIN gibt keine Zeilen für die Anzahl 0 zurück
- SQL-Abfrage mit Outer-Join und Begrenzung der untergeordneten Datensätze für jeden Elternteil
- Linker äußerer Join verhält sich wie innerer Join
- Wählen Sie Zeilen aus, die in keiner anderen Tabelle vorhanden sind
usw.