Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come eliminare i record NON IN

Vorrei iniziare con delle ipotesi.

  1. Hai un modello di dati a catena:Progetti --* Schemi di progetto --* Schemi
  2. Il tuo obiettivo è avere solo catene valide, quindi nessun ProjectSchemes senza Project, nessuno Scheme senza ProjectSchemes.
  3. NULL non è un valore valido per uno dei tuoi ID.
  4. Tutti gli ID sono univoci nella loro tabella
  5. Non utilizzi i meccanismi di integrità referenziale del tuo database

Di conseguenza, il tuo SELECT elencherà lo schema_id per tutti gli schemi nella tabella degli schemi.

Detto questo, dovresti iniziare a eliminare tutti i ProjectSchemes senza un progetto corrispondente. Questi sono ProjectSchemes con un id NULL o un id che non esiste nella tabella dei progetti:

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

Dopo aver eliminato i ProjectsSchemes senza un progetto, ora potremmo avere alcuni nuovi orfani nella tabella degli schemi. La prossima cosa è ora eliminare tutti gli schemi che hanno un ID NULL o un ID che non esiste nella tabella ProjectsSchemes:

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

C'è ancora la possibilità di avere schemi che non sono collegati a un progetto senza eliminare i ProjectSchemes.