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
)