For at besvare dit spørgsmål:Ja, det er muligt, og din forespørgsel gør præcis det. Vi kan bevise det ved at introducere en tredje række i foo
tabel:http://sqlfiddle.com/#!15/06dfe/2
Dit problem er ikke med LEFT JOIN
til json_array_elements
men med implicit lateral krydssamling. Din forespørgsel svarer til:
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
Det du ønsker er en lateral venstre sammenføjning mellem foo
og 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