2012-07-03 31 views
0

我有我的記錄(在示例1000),它與使用parentid的父項相關的其他記錄。 我想在所有「孩子」都處於關閉狀態時選擇該記錄!SQL查詢問題 - 對於綁定到同一表中的其他記錄的記錄始終返回空值

表T1:

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

我寫SQL但儘管它不應該(「不」並不能很好地工作)

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

但它返回的返回我空me null雖然SELECT PARENTID FROM ID WHERE STATUS!='CLOSED'不返回1000. 爲什麼?如何選擇,然後如果「NOT IN」子句不起作用。

非常非常重要的一點是我不能使用"WHERE PARENTID=ID"雖然我知道這將是解決方案,但我必須以不同的方式做到這一點!

回答

2

IN子句不會與空工作。使用NVL在查詢中得到解決(甲骨文) -

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'); 
+0

是的! COALESCE是解決方案!謝謝!這個函數到底做了什麼?再次感謝 – Dejan

+1

如果該列爲空,它將用您指定的值替換null,在這種情況下爲0,以便您可以將其與「IN」子句進行比較。您無法在null上執行!=,=,IN等因爲空不等於平等或不平等。 – JUG

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

+0

嗨,我使用的DB2。看起來這個函數在DB2中不起作用。我嘗試與COALESCE(PARENTID,0),但它然後返回錯誤!如果我嘗試COALESCE(PARENTID,null),它會再次返回空結果。你知道解決方案嗎?感謝您的參與 – Dejan

0

另一種方式是

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