PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Plusieurs jointures à gauche sur plusieurs tables dans une requête

Ce type de requête devrait fonctionner - après réécriture avec un JOIN explicite syntaxe :

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'

Le fil de déclenchement ici est qu'un JOIN explicite se lie avant "l'ancien style" CROSS JOIN avec virgule (, ). Je cite le manuel ici :

Après réécriture de la première, toutes les jointures sont appliquées de gauche à droite (logiquement - Postgres est libre de réorganiser les tables dans le plan de requête sinon) et cela fonctionne.

Juste pour faire valoir mon point de vue, cela fonctionnerait aussi :

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'

Mais JOIN explicite la syntaxe est généralement préférable, comme votre cas l'illustre une fois de plus.

Et sachez que plusieurs (LEFT ) JOIN peut multiplier les lignes :