Det finns en ökända gotcha för not in . I princip id not in (1,2,3) är en förkortning för:
id <> 1 and id <> 2 and id <> 3
Nu om dina TimeEntries tabellen innehåller valfri rad med ett TaskID av null , not in översätts till:
ID <> null and ID <> 1 and ID <> 2 AND ...
Resultatet av en jämförelse med null är alltid unknown . Sedan unknown är inte sant i SQL, where klausulen filtrerar bort alla rader och det slutar med att du inte raderar någonting.
En enkel fix är en extra where-sats i underfrågan:
DELETE FROM Tasks
WHERE ID not IN
(
SELECT TaskID
FROM TimeEntries
WHERE TaskID is not null
)