Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So löschen Sie Datensätze, die NICHT IN sind

Ich möchte mit Annahmen beginnen.

  1. Sie haben ein kettenartiges Datenmodell:Projekte --* Projektschemata --* Schemata
  2. Ihr Ziel ist es, nur gültige Ketten zu haben, also keine ProjectSchemes ohne Project, keine Schemes ohne ProjectSchemes.
  3. NULL ist kein gültiger Wert für eine Ihrer IDs.
  4. Alle IDs sind in ihrer Tabelle eindeutig
  5. Sie verwenden keine referenziellen Integritätsmechanismen Ihrer Datenbank

Als Ergebnis würde Ihr SELECT die scheme_id für alle Schemes in der Schemes-Tabelle auflisten.

Das heißt, Sie sollten damit beginnen, alle Projektschemata ohne entsprechendes Projekt zu löschen. Dies sind Projektschemata mit einer ID von NULL oder einer ID, die nicht in der Projekttabelle vorhanden ist:

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

Nach dem Löschen der ProjectsSchemes ohne Projekt haben wir jetzt möglicherweise einige neue Waisenkinder in der Schemes-Tabelle. Als nächstes müssen nun alle Schemata gelöscht werden, die eine ID von NULL oder eine ID haben, die nicht in der ProjectsSchemes-Tabelle vorhanden ist:

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

Es besteht immer noch die Möglichkeit, Schemata zu haben, die nicht mit einem Projekt verbunden sind, ohne die Projektschemata zu löschen.