0

私は、parentid を使用して親として他のレコードに関連付けられているレコード (例 1000) を持っています。すべての「子」のステータスが「クローズ」のときにそのレコードを選択したい!

テーブルは 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 を返さないのに nullを返します。なぜですか? 「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 に答える