Il y a un piège notoire pour not in . En gros, id not in (1,2,3) est un raccourci pour :
id <> 1 and id <> 2 and id <> 3
Maintenant, si votre TimeEntries table contient n'importe quelle ligne avec un TaskID de null , le not in se traduit par :
ID <> null and ID <> 1 and ID <> 2 AND ...
Le résultat d'une comparaison avec null est toujours unknown . Depuis unknown n'est pas vrai en SQL, le where La clause filtre toutes les lignes et vous ne supprimez rien.
Une solution simple consiste à ajouter une clause where supplémentaire dans la sous-requête :
DELETE FROM Tasks
WHERE ID not IN
(
SELECT TaskID
FROM TimeEntries
WHERE TaskID is not null
)