sql >> Database >  >> RDS >> Sqlserver

Hoe records te verwijderen NIET IN

Ik wil graag beginnen met aannames.

  1. Je hebt een kettingachtig gegevensmodel:Projecten --* ProjectSchemes --* Schema's
  2. Je doel is om alleen geldige ketens te hebben, dus geen ProjectSchemes zonder Project, geen Schema's zonder ProjectSchemes.
  3. NULL is geen geldige waarde voor een van uw ID's.
  4. Alle ID's zijn uniek in hun tabel
  5. U gebruikt geen referentiële integriteitsmechanismen van uw database

Als gevolg hiervan zou uw SELECT de scheme_id voor alle schema's in de tabel Schema's weergeven.

Zei dat je zou moeten beginnen met het verwijderen van alle ProjectSchemes zonder een bijbehorend Project. Dit zijn ProjectSchemes met een id van NULL of een id die niet bestaat in de Projects Table:

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

Na het verwijderen van de ProjectsSchemes zonder Project hebben we nu mogelijk enkele nieuwe weeskinderen in de Schemes Table. Het volgende ding is nu om alle schema's te verwijderen die een id van NULL hebben of een id die niet bestaat in de ProjectsSchemes-tabel:

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

Er is nog steeds een kans om schema's te hebben die niet aan een project zijn gekoppeld zonder de ProjectSchemes te verwijderen.



  1. Een FULLTEXT-index in Doctrine 2 toevoegen met annotaties?

  2. Is het een slechte gewoonte om de instructie EXIT WHEN te gebruiken bij het doorlopen van CURSOR's in Oracle?

  3. CriteriaQuery maand en jaar filter

  4. Cloud9 postgres