0

我有我的记录(在示例 1000 上),它与使用 parentid 的其他记录相关。我想在它的所有“孩子”都处于关闭状态时选择该记录!

表是 T1:

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

我写了 SQL,但它返回我 null 尽管它不应该(“不在”不能很好地工作)

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

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

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

4

3 回答 3

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');
于 2012-07-03T16:15:52.837 回答
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'
        )

有关更多信息,请参阅:

处理 SQL NULL 的 4 条简单规则

于 2012-07-03T16:10:06.613 回答
0

另一种方法是

SELECT ID
FROM T1 T1Name
WHERE PARENTID IS NULL AND 
not exists(select 1 from T1 where ID=T1Name.parentid and status!='CLOSED')
于 2012-07-03T16:27:30.930 回答