Questo tipo di query dovrebbe funzionare - dopo aver riscritto con JOIN
esplicito sintassi:
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'
Il filo di sgancio qui è che un esplicito JOIN
si lega prima del "vecchio stile" CROSS JOIN
con virgola (,
). Cito il manuale qui:
Dopo aver riscritto il primo, tutti i join vengono applicati da sinistra a destra (logicamente - Postgres è libero di riorganizzare le tabelle nel piano di query in caso contrario) e funziona.
Solo per chiarire il mio punto, funzionerebbe anche questo:
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'
Ma esplicito JOIN
la sintassi è generalmente preferibile, come dimostra ancora una volta il tuo caso.
E tieni presente che più (LEFT
) JOIN
può moltiplicare le righe: