Để trả lời câu hỏi của bạn:Có, hoàn toàn có thể và truy vấn của bạn thực hiện chính xác điều đó.Chúng tôi có thể chứng minh điều đó bằng cách giới thiệu hàng thứ ba trong foo
bảng: http://sqlfiddle.com/#!15/06dfe/2
Vấn đề của bạn không phải là với LEFT JOIN
tới json_array_elements
nhưng với phép nối chéo bên ngầm định. Truy vấn của bạn tương đương với:
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
Những gì bạn muốn là một phép nối bên trái giữa foo
và 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