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: