Odpověď na vaši otázku:Ano, je to možné a váš dotaz přesně to dělá. Můžeme to dokázat zavedením třetího řádku do foo
tabulka:http://sqlfiddle.com/#!15/06dfe/2
Váš problém není s LEFT JOIN
na json_array_elements
ale s implicitním bočním křížovým spojením. Váš dotaz je ekvivalentní:
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
Co chcete, je boční levé spojení mezi foo
a 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