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

Mehrere Linksverknüpfungen für mehrere Tabellen in einer Abfrage

Diese Art von Abfrage sollte funktionieren - nach dem Umschreiben mit explizitem JOIN Syntax:

SELECT something
FROM   master      parent
JOIN   master      child ON child.parent_id = parent.id
LEFT   JOIN second parentdata ON parentdata.id = parent.secondary_id
LEFT   JOIN second childdata ON childdata.id = child.secondary_id
WHERE  parent.parent_id = 'rootID'

Der Stolperdraht hier ist, dass ein explizites JOIN bindet vor "altem" CROSS JOIN mit Komma (, ). Ich zitiere das Handbuch hier:

Nach dem Umschreiben des ersten werden alle Joins von links nach rechts angewendet (logischerweise steht es Postgres frei, Tabellen im Abfrageplan ansonsten neu anzuordnen) und es funktioniert.

Nur um meinen Standpunkt zu verdeutlichen, das würde auch funktionieren:

SELECT something
FROM   master parent
LEFT   JOIN second parentdata ON parentdata.id = parent.secondary_id
,      master child
LEFT   JOIN second childdata ON childdata.id = child.secondary_id
WHERE  child.parent_id = parent.id
AND    parent.parent_id = 'rootID'

Aber explizit JOIN Syntax ist im Allgemeinen vorzuziehen, wie Ihr Fall wieder einmal zeigt.

Und seien Sie sich bewusst, dass mehrere (LEFT ) JOIN kann Zeilen multiplizieren: