За да отговоря на въпроса ви:Да, възможно е и вашата заявка прави точно това. Можем да го докажем, като въведем трети ред в foo
таблица:http://sqlfiddle.com/#!15/06dfe/2
Проблемът ви не е с LEFT JOIN
към json_array_elements
но с имплицитно странично кръстосано съединение. Вашата заявка е еквивалентна на:
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;
http://sqlfiddle.com/#!15/06dfe/5
Това, което искате, е странично ляво съединение между foo
и 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;
http://sqlfiddle.com/#!15/06dfe/6