PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Più join sinistri su più tabelle in una query

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: