Този вид заявка трябва да работи - след пренаписване с изричен JOIN синтаксис:
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'
Изключващият проводник тук е изричен JOIN се свързва преди "стар стил" CROSS JOIN със запетая (, ). Цитирам ръководството тук:
След пренаписване на първия, всички съединения се прилагат отляво надясно (логично - Postgres е свободен да пренарежда таблиците в плана на заявката в противен случай) и работи.
Само за да кажа, че това също би свършило работа:
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'
Но изрично JOIN синтаксис обикновено е за предпочитане, както вашият случай показва още веднъж.
И имайте предвид, че множество (LEFT ) JOIN може да умножава редове: