Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Manière élégante de supprimer des lignes qui ne sont pas référencées par une autre table

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
       )