PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Erklären Sie JOIN vs. LEFT JOIN und Leistungsvorschläge für WHERE-Bedingungen ausführlicher

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.