Aby odpowiedzieć na Twoje pytanie:Tak, jest to możliwe i dokładnie to robi Twoje zapytanie. Możemy to udowodnić, wprowadzając trzeci wiersz w foo
tabela:http://sqlfiddle.com/#!15/06dfe/2
Twój problem nie dotyczy LEFT JOIN
do json_array_elements
ale z niejawnym poprzecznym połączeniem krzyżowym. Twoje zapytanie jest równoważne z:
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
To, czego potrzebujesz, to boczne lewe połączenie między foo
i 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