避免在PostgreSQL和JSON数据中混合隐式和显式连接

时间:2018-01-04 21:02:46

标签: json postgresql join

我正在使用PostgreSQL数据库,该数据库包含具有嵌套JSON数据的列。我使用jsonb_array_elements()来解包JSON对象和隐式连接以访问JSON对象中的嵌套条目:

SELECT table1.id, json_data1.*
FROM table1,
jsonb_array_elements(json_column->'json_data1') json_data1,
jsonb_array_elements(json_data1->'json_data2') json_data2;

这很有效。我通常会使用相同的table1.id获取多行,因为json_data2是数组的一部分。

但是,我还需要加入一些其他表来根据业务逻辑执行一些过滤。所以,当我尝试这个时:

SELECT table1.id, json_data1.*
FROM table1,
jsonb_array_elements(json_column->'json_data1') json_data1,
jsonb_array_elements(json_data1->'json_data2') json_data2;
JOIN table2 ON table2.id = table1.tb2_id

我收到INVALID REFERENCE错误:

ERROR:  invalid reference to FROM-clause entry for table "table1"
LINE 5: JOIN table2 ON table2.id = tabl...
                                          ^
HINT:  There is an entry for table "table1", but it cannot be referenced from this part of the query.

我知道JOIN语句的优先级高于隐式连接,但为什么连接失败?它引用了table1,它已经存在。它不依赖于我的JSON展开中的任何隐式表。

我知道这是因为我混合了隐式和显式连接。但是,我不知道如何在json_column列中打开JSON数据,然后在没有隐式连接的情况下访问其内容。

我的猜测是我需要将json_data1json_data2转换为显式连接表,但没有外键可以加入!

1 个答案:

答案 0 :(得分:1)

使用横向连接:

SELECT table1.id, json_data1.*
FROM table1
  cross join lateral jsonb_array_elements(json_column->'json_data1') as json_data1 
  cross join lateral jsonb_array_elements(json_data1 ->'json_data2') json_data2
  JOIN table2 ON table2.id = table1.tb2_id