Jest jedna notoryczna pułapka dla not in
. Zasadniczo id not in (1,2,3)
to skrót od:
id <> 1 and id <> 2 and id <> 3
Teraz, jeśli Twoje TimeEntries
tabela zawiera dowolny wiersz z TaskID
z null
, not in
przekłada się na:
ID <> null and ID <> 1 and ID <> 2 AND ...
Wynik porównania z null
jest zawsze unknown
. Od unknown
nie jest prawdą w SQL, where
klauzula odfiltrowuje wszystkie wiersze, a Ty niczego nie usuwasz.
Prostą poprawką jest dodatkowa klauzula where w podzapytaniu:
DELETE FROM Tasks
WHERE ID not IN
(
SELECT TaskID
FROM TimeEntries
WHERE TaskID is not null
)