2016-03-27 19 views
1

Kann jemand erklären, warumSQL Server - Nullwert im Set

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

1.483 Zeilen zurückgibt. Aber ,

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

0 zurück Reihen?

Ich weiß, dass es mit der Tatsache zu tun hat, dass "SELECT bl_id FROM eq" eine bl_id zurückgeben kann, die null sein kann.

Aber was ich nicht verstehe, ist f sogar einer der bl_id Werte ist null die äußere WHERE-Klausel wird nie wahr zurückgeben. Warum?

Antwort

4

So funktioniert NOT IN funktioniert. Ich stark empfehlen, dass Sie lernen NOT EXISTS stattdessen zu verwenden:

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

Diese die Semantik, die Sie erwarten.

Der Grund ist, weil NULL in SQL "unbekannt" bedeutet. Es ist nicht ein bestimmter Wert. Wenn Sie also diese haben:

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

Dann können SQL bewerten die erste auf „falsch“ und die zweite auf „true“. Wenn Sie jedoch:

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

Dann ist der erste "falsch", weil "1" im Satz ist. Die zweite ist NULL, weil wir nicht wissen, welcher Wert NULL sein könnte, und es könnte 1 sein. Daher gibt NOT IN mit einem NULL Wert in der Teilmenge immer "false" oder NULL zurück, und keine dieser Möglichkeiten ist wahr.