SQL查询问题 - 对于绑定到同一表中其他记录的记录,始终返回null

时间:2012-07-03 16:01:37

标签: sql

我的记录(例如1000)与使用parentid的父记录相关。 当所有“孩子”处于关闭状态时,我想选择该记录!

表是T1:

ID       PARENTID     STATUS
1000      null        PENDING
1001      1000        CLOSED
1002      1000        CLOSED

我写了SQL,但是它返回null但是它不应该(“not in”不能很好地工作)

SELECT ID
FROM T1
WHERE PARENTID IS NULL AND ID NOT IN (SELECT PARENTID FROM T1 WHERE STATUS!='CLOSED' )

但是虽然SELECT PARENTID FROM ID WHERE STATUS!='CLOSED'没有返回1000,但它返回我的空值。 为什么?如果“NOT IN”子句不起作用,如何选择。

非常,非常重要的是我不能使用"WHERE PARENTID=ID"虽然我知道这将是解决方案,但我必须以不同的方式做到这一点!

3 个答案:

答案 0 :(得分:2)

IN子句不适用于null。在查询中使用nvl(Oracle) -

select ID from T1 where PARENTID is null and ID not in (select nvl(parentid,0) from T1 where status != 'CLOSED');

或者,如果您使用的是db2 -

select ID from T1 where PARENTID is null and ID not in (select coalesce(parentid,0) from T1 where status != 'CLOSED');

答案 1 :(得分:0)

原因是您的子查询正在返回NULL。当ansi_nulls打开时,PARENTID<> NULL未知,因此您不会获得任何行。

试试这个:

select ID
from T1
where PARENTID is null and ID not in (
        select isnull(PARENTID, -1)
        from T1
        where status != 'CLOSED'
        )

有关详细信息,请参阅:

4 Simple Rules for Handling SQL NULLs

答案 2 :(得分:0)

另一种方式是

SELECT ID
FROM T1 T1Name
WHERE PARENTID IS NULL AND 
not exists(select 1 from T1 where ID=T1Name.parentid and status!='CLOSED')