Der er en berygtet gotcha for not in . Grundlæggende er id not in (1,2,3) er en forkortelse for:
id <> 1 and id <> 2 and id <> 3
Hvis nu dine TimeEntries tabel indeholder en række med et TaskID af null , not in oversættes til:
ID <> null and ID <> 1 and ID <> 2 AND ...
Resultatet af en sammenligning med null er altid unknown . Siden unknown er ikke sandt i SQL, where klausul filtrerer alle rækker fra, og du ender med at slette intet.
En nem rettelse er en ekstra where-klausul i underforespørgslen:
DELETE FROM Tasks
WHERE ID not IN
(
SELECT TaskID
FROM TimeEntries
WHERE TaskID is not null
)