Je voudrais commencer par des hypothèses.
- Vous avez un modèle de données en forme de chaîne :Projects --* ProjectSchemes --* Schemes
- Votre objectif est de n'avoir que des chaînes valides, donc pas de ProjectSchemes sans Project, pas de Schemes sans ProjectSchemes.
- NULL n'est pas une valeur valide pour l'un de vos identifiants.
- Tous les identifiants sont uniques dans leur table
- 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.