json数组上的Postgresql左外部联接
我想知道是否有可能在一个表列的json_数组_元素和另一个表之间进行左外连接?类似于下面的内容,但这不起作用json数组上的Postgresql左外部联接,json,postgresql,Json,Postgresql,我想知道是否有可能在一个表列的json_数组_元素和另一个表之间进行左外连接?类似于下面的内容,但这不起作用 SELECT * FROM foo, json_array_elements (foo.bars :: json) foo_bars LEFT OUTER JOIN bar ON (foo_bars ->> 'id') :: BIGINT = bar.ID; 表结构如下所示 FOO -----------------------------------------
SELECT *
FROM foo,
json_array_elements (foo.bars :: json) foo_bars
LEFT OUTER JOIN bar ON (foo_bars ->> 'id') :: BIGINT = bar.ID;
表结构如下所示
FOO
------------------------------------------
| ID | NAME | BARS |
|------------------------------------------|
| 1 | FOO1 | [{ "id" : 1}, { "id" : 2 }]|
|------------------------------------------|
| 2 | FOO1 | [] |
------------------------------------------
BAR
-------------
| ID | NAME |
|-------------|
| 1 | BAR1 |
|-------------|
| 2 | BAR2 |
-------------
我希望查询的输出是
--------------------------------------------------------
| ID | NAME | BARS | ID | NAME |
|------------------------------------------|-------------|
| 1 | FOO1 | [{ "id" : 1}, { "id" : 2 }]| 1 | BAR1 |
|------------------------------------------|-------------|
| 1 | FOO1 | [{ "id" : 1}, { "id" : 2 }]| 2 | BAR2 |
|------------------------------------------|-------------|
| 2 | FOO1 | [] | null | null |
--------------------------------------------------------
回答你的问题:是的,这是可能的,而你的查询正是这样做的。 我们可以通过在
foo
表中引入第三行来证明这一点:
您的问题不在于左连接到json_数组_元素
,而在于隐式横向交叉连接。您的查询相当于:
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;
您需要的是foo
和json\u数组\u元素之间的横向左连接
:
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;
“不起作用。”并不能很好地描述查询行为与期望的行为。这非常有效。甚至可以使用空json。我以前也从未听说过SQL小提琴。我希望我能给你100张赞成票。我去掉了侧面,结果是一样的@鄭元傑 这可能是隐含的,它是多年前的事了,我再也不明白了。@JakubKania我仍在努力理解它。奥茨