我有以下查询
select *
from object
where parent_id = ?
and id not in ( select parent_id
from object
where discriminator='ABC')
我尝试使用如下的连接
select *
from object parent
inner join object child
on (parent.id != child.parent_id)
where child.discriminator='ABC'
但我的结果不正确。有没有办法提高postgres中的查询性能。
抱歉,我猜,我第一次没有解释我的问题,
以下是修改后的查询
select *
from object parent
where parent.parent_id = ?
and parent.discriminator ='XYZ'
and parent.id not in ( select child.parent_id
from object child
where child.discriminator='ABC')
所以,我被赋予了身份,需要找到所有孩子,没有孩子。
答案 0 :(得分:4)
我使用not exists
进行反连接:
select *
from object as o
where
o.parent_id = ? and
not exists (
select * from object as t
where t.parent_id = o.id and t.discriminator='ABC'
)
请注意也使用表的别名,如果您没有使用别名(或表名),则可能会得到错误的结果 - 请参阅SQL IN query produces strange result。
答案 1 :(得分:0)
尝试left join
select * from object parent
left join object child on parent.id = child.parent_id
where parent_id = ?
and child.discriminator = 'ABC'
and child.parent_id is null
答案 2 :(得分:0)
如果我理解正确你需要这样的东西
select parent.*
from object parent
left join
(select * from object
where child.discriminator='ABC') child
on parent.id = child.parent_id
where parent.parent_id = ? and child.parent_id is null
<强>更新强>
实际上,这可以在没有连接语句的情况下实现。
select *
from object
where parent_id = ? and
(discriminator!='ABC' OR (discriminator='ABC' and parent_id!=id))