Para responder à sua pergunta:Sim, é possível e sua consulta faz exatamente isso. Podemos provar isso introduzindo uma terceira linha em
foo
tabela:http://sqlfiddle.com/#!15/06dfe/2
Seu problema não é com
LEFT JOIN
para json_array_elements
mas com junção cruzada lateral implícita. Sua consulta é equivalente a: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
O que você quer é uma junção lateral esquerda entre
foo
e 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