Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
json数组上的Postgresql左外部联接_Json_Postgresql - Fatal编程技术网

json数组上的Postgresql左外部联接

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 -----------------------------------------

我想知道是否有可能在一个表列的json_数组_元素和另一个表之间进行左外连接?类似于下面的内容,但这不起作用

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我仍在努力理解它。奥茨