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
)