2016-03-27 8 views
1

でのNULL値誰かが1483行を返すSQL Serverの - セット

なぜ

SELECT bl_id 
    FROM bl 
WHERE bl_id NOT IN (SELECT bl_id FROM eq 
         WHERE bl_id IS NOT NULL) 
を説明することができます。 しかし、0行を返す

SELECT bl_id 
    FROM bl 
WHERE bl_id NOT IN (SELECT bl_id FROM eq) 

私は、 "SELECT bl_id FROM eq"がnullになる可能性のあるbl_idを返すことができることを認識しています。

しかし、私が理解していないのは、bl_idの値さえ1つであっても、外側のWHERE節は決してtrueを返さないということです。どうして?

答えて

4

つまり、NOT INの動作です。

SELECT bl_id 
FROM bl 
WHERE NOT EXISTS (SELECT 1 
        FROM eq 
        WHERE eq.bl_id = bl.bl_id 
       ); 

これは、あなたが期待する意味を持っている:私は強くは、あなたの代わりにNOT EXISTSを使用することを学ぶことをお勧めします

SQLのNULLは「不明」を意味するためです。 ではなく、特定の値であるです。したがって、あなたが持っている場合は、これら:

where 1 not in (1, 2, 3) 
where 1 not in (2, 3) 

は、次にSQLは「false」にし、「真」に第1、第2を評価することができます。ただし、あなたが持っている場合:

where 1 not in (1, 2, 3, NULL) 
where 1 not in (2, 3, NULL) 

"1"がセットに含まれているため、最初は "false"です。 2番目の値はNULLです。NULLの値はわからないので、1になる可能性があります。したがって、サブセット内のNULL値を持つNOT INの値は常に「false」またはNULLを返し、いずれの場合も真ではありません。

関連する問題