2

我有以下查询

select * 
  from object 
 where parent_id = ? 
  and id not in ( select parent_id 
                    from object 
                   where discriminator='ABC')

我尝试使用 Joins 如下

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

所以besically我已经获得了一个id,需要找到它的所有孩子,他们没有任何孩子。

4

3 回答 3

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 查询产生奇怪的结果

于 2013-09-11T06:03:43.067 回答
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
于 2013-09-11T05:59:38.847 回答
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))
于 2013-09-11T06:16:43.257 回答