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
)