Chciałbym zacząć od założeń.
- Masz łańcuchowy model danych:Projekty --* Schematy projektów --* Schematy
- Twoim celem jest posiadanie tylko prawidłowych łańcuchów, więc żadnych Schematów Projektów bez Projektów, żadnych Schematów bez Schematów Projektów.
- NULL nie jest prawidłową wartością jednego z Twoich identyfikatorów.
- Wszystkie identyfikatory są unikalne w swojej tabeli
- Nie używasz mechanizmów integralności referencyjnej swojej bazy danych
W rezultacie Twój SELECT wyświetli identyfikator schematu dla wszystkich schematów w tabeli Schematy.
Powiedział, że powinieneś zacząć usuwać wszystkie ProjectSchemes bez odpowiedniego projektu. Są to schematy projektów z identyfikatorem NULL lub identyfikatorem, który nie istnieje w tabeli projektów:
DELETE ProjectSchemes WHERE (Project_Id is NULL) OR
(NOT EXISTS (SELECT * FROM Projects WHERE
Projects.Project_Id = ProjectSchemes.Project_Id))
Po usunięciu schematów projektów bez projektu możemy teraz mieć kilka nowych sierot w tabeli schematów. Następną rzeczą jest teraz usunięcie wszystkich schematów, które mają identyfikator NULL lub identyfikator, który nie istnieje w tabeli ProjectsSchemes:
DELETE Schemes WHERE (Scheme_Id is NULL) OR
(NOT EXISTS (SELECT * FROM ProjectSchemes WHERE
ProjectSchemes.Scheme_Id = Schemes.Scheme_Id))
Nadal istnieje szansa na posiadanie schematów, które nie są połączone z projektem bez usuwania schematów projektów.