我的记录(例如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"
虽然我知道这将是解决方案,但我必须以不同的方式做到这一点!
答案 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'
)
有关详细信息,请参阅:
答案 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')