Jeg vil gerne starte med antagelser.
- Du har en kædelignende datamodel:Projects --* ProjectSchemes --* Schemes
- Dit mål er kun at have gyldige kæder, så ingen ProjectSchemes uden Project, ingen Schemes uden ProjectSchemes.
- NULL er ikke en gyldig værdi for et af dine id'er.
- Alle id'er er unikke i deres tabel
- Du bruger ikke referenceintegritetsmekanismer i din database
Som et resultat vil din SELECT angive scheme_id for alle Schemes i Schemes-tabellen.
Sagde, at du skulle begynde at slette alle ProjectSchemes uden et tilsvarende projekt. Disse er projektskemaer med et id på NULL eller et id, der ikke findes i projekttabellen:
DELETE ProjectSchemes WHERE (Project_Id is NULL) OR
(NOT EXISTS (SELECT * FROM Projects WHERE
Projects.Project_Id = ProjectSchemes.Project_Id))
Efter at have slettet projektskemaerne uden et projekt, kan vi nu have nogle nye forældreløse børn i skematabellen. Den næste ting er nu at slette alle skemaer, der har et id på NULL eller et id, der ikke findes i Projects Schemes-tabellen:
DELETE Schemes WHERE (Scheme_Id is NULL) OR
(NOT EXISTS (SELECT * FROM ProjectSchemes WHERE
ProjectSchemes.Scheme_Id = Schemes.Scheme_Id))
Der er stadig en chance for at have ordninger, der ikke er forbundet med et projekt uden at slette ProjectSchemes.