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

Sådan sletter du poster IKKE IN

Jeg vil gerne starte med antagelser.

  1. Du har en kædelignende datamodel:Projects --* ProjectSchemes --* Schemes
  2. Dit mål er kun at have gyldige kæder, så ingen ProjectSchemes uden Project, ingen Schemes uden ProjectSchemes.
  3. NULL er ikke en gyldig værdi for et af dine id'er.
  4. Alle id'er er unikke i deres tabel
  5. 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.



  1. nulværdi undtagelse ved indtastning i databasen

  2. Tabelforhold for undertyper

  3. MySQL Tæl produkter fra alle underkategorier

  4. Eliminering af MySQL Split-Brain i Multi-Cloud-databaser