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

Comment supprimer des enregistrements PAS DANS

Je voudrais commencer par des hypothèses.

  1. Vous avez un modèle de données en forme de chaîne :Projects --* ProjectSchemes --* Schemes
  2. Votre objectif est de n'avoir que des chaînes valides, donc pas de ProjectSchemes sans Project, pas de Schemes sans ProjectSchemes.
  3. NULL n'est pas une valeur valide pour l'un de vos identifiants.
  4. Tous les identifiants sont uniques dans leur table
  5. Vous n'utilisez pas les mécanismes d'intégrité référentielle de votre base de données

En conséquence, votre SELECT répertorie le scheme_id pour tous les Schemes dans la table Schemes.

Cela dit, vous devriez commencer à supprimer tous les ProjectSchemes sans projet correspondant. Il s'agit de ProjectSchemes avec un identifiant NULL ou un identifiant qui n'existe pas dans la table des projets :

DELETE ProjectSchemes WHERE (Project_Id is NULL) OR 
(NOT EXISTS (SELECT * FROM Projects WHERE
             Projects.Project_Id = ProjectSchemes.Project_Id))

Après avoir supprimé les ProjectsSchemes sans projet, nous pouvons maintenant avoir de nouveaux orphelins dans la table Schemes. La prochaine étape consiste maintenant à supprimer tous les schémas qui ont un identifiant NULL ou un identifiant qui n'existe pas dans la table ProjectsSchemes :

DELETE Schemes WHERE (Scheme_Id is NULL) OR 
(NOT EXISTS (SELECT * FROM ProjectSchemes WHERE
             ProjectSchemes.Scheme_Id = Schemes.Scheme_Id))

Il est toujours possible d'avoir des schémas qui ne sont pas connectés à un projet sans supprimer les ProjectSchemes.