Jag skulle vilja börja med antaganden.
- Du har en kedjeliknande datamodell:Projects --* Project Schemes --* Schemes
- Ditt mål är att bara ha giltiga kedjor, så inga Project Schemes utan Project, inga Schemes utan Project Schemes.
- NULL är inte ett giltigt värde för ett av dina ID.
- Alla ID är unika i sin tabell
- Du använder inte referensintegritetsmekanismer för din databas
Som ett resultat av detta skulle din SELECT lista scheme_id för alla Schemes i Schemes-tabellen.
Sa att du borde börja ta bort alla Project Schemes utan ett motsvarande projekt. Dessa är projektscheman med ett ID på NULL eller ett ID som inte finns i projekttabellen:
DELETE ProjectSchemes WHERE (Project_Id is NULL) OR
(NOT EXISTS (SELECT * FROM Projects WHERE
Projects.Project_Id = ProjectSchemes.Project_Id))
Efter att ha tagit bort Projects Schemes utan projekt kan vi nu ha några nya föräldralösa barn i Schemes-tabellen. Nästa sak är nu att ta bort alla scheman som har ett ID på NULL eller ett id som inte finns i Projects Schemes-tabellen:
DELETE Schemes WHERE (Scheme_Id is NULL) OR
(NOT EXISTS (SELECT * FROM ProjectSchemes WHERE
ProjectSchemes.Scheme_Id = Schemes.Scheme_Id))
Det finns fortfarande en chans att ha scheman som inte är kopplade till ett projekt utan att ta bort Project Schemes.