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
)