两个表通过子jsonb匹配连接

问题描述 投票:0回答:1

为了简单起见,我在 PostgreSQL 中有两个表 A 和 B,其结构完全相同:

{
    id varchar2(32) unique,
    data jsonb
}

是否可以编写查询,该查询将返回 A 中的所有行,其中特定的 B.data 是 A.data 的“子 json”?

用类似 SQL 的术语表达:

SELECT A.*
FROM A, B
WHERE B.id = ? AND B.data is sub-json of A.data

json1 是 json2 的子 json,意味着通过从 A 中删除一些键/值对可以获得 B。示例:

{
   "key1":"value1",
   "key3":"value3"
}

的子json
{
   "key1":"value1",
   "key2":"value2",
   "key3":"value3"
}

json-s 可以有更复杂的结构。

如果可能的话,与将这些 json-s 分解为行并进行关系表连接相比,性能如何?

postgresql join jsonb
1个回答
0
投票

<@ operator正是您所说的“是…的子json”的意思。
我还建议宁愿使用

join ... on
语法,而不是使用
where
子句的过时语法。

select a.*
from a 
JOIN b ON b.data <@ a.data
where b.id = ?;

至于性能,您可以在 JSONB 字段上创建和使用 GIN 索引,这将使上述查询非常快。扁平化然后连接的方法不会给您带来切实的好处。

不相关,但在 PostgreSQL 中最好使用小写名称。

© www.soinside.com 2019 - 2024. All rights reserved.