Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como excluir registros que NÃO ESTÃO


Gostaria de começar com suposições.
  1. Você tem um modelo de dados em cadeia:Projetos --* ProjetoEsquemas --* Esquemas
  2. Sua meta é ter apenas cadeias válidas, portanto, não há ProjectSchemes sem Project, nem Schemes sem ProjectSchemes.
  3. NULL não é um valor válido para um de seus IDs.
  4. Todos os IDs são exclusivos em suas tabelas
  5. Você não usa mecanismos de integridade referencial de seu banco de dados

Como resultado, seu SELECT listaria o scheme_id para todos os Schemes na tabela Schemes.

Dito isso, você deve começar a excluir todos os ProjectSchemes sem um projeto correspondente. Estes são ProjectSchemes com um id de NULL ou um id que não existe na Tabela de Projetos:
DELETE ProjectSchemes WHERE (Project_Id is NULL) OR 
(NOT EXISTS (SELECT * FROM Projects WHERE
             Projects.Project_Id = ProjectSchemes.Project_Id))

Depois de excluir os ProjectsSchemes sem um projeto, agora podemos ter alguns novos órfãos na tabela de esquemas. A próxima coisa agora é excluir todos os Schemes que possuem um id de NULL ou um id que não existe na Tabela ProjectsSchemes:
DELETE Schemes WHERE (Scheme_Id is NULL) OR 
(NOT EXISTS (SELECT * FROM ProjectSchemes WHERE
             ProjectSchemes.Scheme_Id = Schemes.Scheme_Id))

Ainda há uma chance de ter esquemas que não estão conectados a um projeto sem excluir os ProjectSchemes.