Um Ihre Frage zu beantworten:Ja, es ist möglich und Ihre Abfrage tut genau das. Wir können es beweisen, indem wir eine dritte Zeile in foo einfügen Tabelle:https://sqlfiddle.com/#!15/06dfe/2
Ihr Problem liegt nicht bei LEFT JOIN zu json_array_elements aber mit implizitem seitlichem Cross Join. Ihre Abfrage entspricht:
SELECT *
FROM foo
CROSS JOIN LATERAL json_array_elements (foo.bars :: json) foo_bars
LEFT OUTER JOIN bar ON (foo_bars ->> 'id') :: BIGINT = bar.ID;
https://sqlfiddle.com/#!15/06dfe/5
Was Sie wollen, ist eine seitliche linke Verknüpfung zwischen foo und json_array_elements :
SELECT *
FROM foo LEFT JOIN LATERAL
json_array_elements (foo.bars :: json) foo_bars ON true
LEFT OUTER JOIN bar ON (foo_bars ->> 'id') :: BIGINT = bar.ID;
https://sqlfiddle.com/#!15/06dfe/6