从子查询中删除“not in”claus

时间:2013-09-11 05:56:44

标签: sql postgresql

我有以下查询

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

所以,我被赋予了身份,需要找到所有孩子,没有孩子。

3 个答案:

答案 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))