PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Várias junções à esquerda em várias tabelas em uma consulta


Esse tipo de consulta deve funcionar - depois de reescrever com JOIN explícito sintaxe:
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'

O fio de manobra aqui é que um JOIN explícito vincula antes do "estilo antigo" CROSS JOIN com vírgula (, ). Cito o manual aqui:

Depois de reescrever a primeira, todas as junções são aplicadas da esquerda para a direita (logicamente - o Postgres é livre para reorganizar as tabelas no plano de consulta) e funciona.

Só para deixar meu ponto de vista, isso também funcionaria:
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'

Mas explícito JOIN sintaxe é geralmente preferível, como seu caso ilustra mais uma vez.

E esteja ciente de que vários (LEFT ) JOIN pode multiplicar linhas: