我正在编写一个查询,该查询应该从数据库中不存在的列表中查找元素。我的第一次尝试是使用嵌套查询,其中第一个查询获取 id,然后我right join
在该查询上获取我需要的内容,这很好用:
select v.id from (
select distinct json_data ->> 'elementId' as elementId
from content
and json_data->> 'elementId' in ('id1', 'id2', 'id3')
) as a
right join (values('id1'), ('id2'), ('id3')) as v(id)
on v.id = a.elementId
where a.elementId is null
select
上面的查询非常完美,除了我想要的事实,如果我直接进行比较,我应该能够将嵌套查询减少为常规查询json_data ->> 'elementId'
。
我的尝试:
select v.id
from content a
right join (values('id1'), ('id2'), ('id3')) as v(id)
on json_data ->> 'elementId' = v.id
经过一些调试后,我意识到这永远不会起作用,因为content
即使json_data ->>'elementId'
是,该表也将始终包含一行null
。
编辑:我有一个额外的WHERE
声明,在问题中没有说明,一旦我在ON
我的查询被修复后移动了这个
我的问题是;当想要对数据执行left join
或操作时,有没有办法避免使用嵌套查询?right join
JSON
使用
NOT EXISTS
:或者,如果您更喜欢join:
从技术上讲,要么是“反加入”;并且两者都可能导致相同的查询计划。
看:
考虑升级到当前版本的 Postgres。9.4 已于 2020 年 2 月达到 EOL。
指数
但即使是 Postgres 9.4 也已经支持
jsonb
which (不像json
) 允许 GIN 索引来支持您的查询。看:或者,如果您只关注此查询,则表达式上的普通 btree应该是最佳选择:
有关的: