sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo eliminar registros que NO ESTÁN EN

Me gustaría comenzar con suposiciones.

  1. Tiene un modelo de datos en forma de cadena:Proyectos --* ProjectSchemes --* Schemes
  2. Su objetivo es tener solo cadenas válidas, por lo que no hay ProjectSchemes sin Project, ni Schemes sin ProjectSchemes.
  3. NULL no es un valor válido para una de sus identificaciones.
  4. Todas las identificaciones son únicas en su tabla
  5. No utiliza mecanismos de integridad referencial de su base de datos

Como resultado, su SELECT listaría el Scheme_id para todos los Schemes en la tabla Schemes.

Dicho esto, debe comenzar a eliminar todos los ProjectSchemes sin un proyecto correspondiente. Estos son ProjectSchemes con una identificación de NULL o una identificación que no existe en la tabla de proyectos:

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

Después de eliminar los ProyectosEsquemas sin un Proyecto, ahora podemos tener algunos huérfanos nuevos en la Tabla de Esquemas. Lo siguiente ahora es eliminar todos los esquemas que tienen una identificación de NULL o una identificación que no existe en la tabla ProjectsSchemes:

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

Todavía existe la posibilidad de tener esquemas que no estén conectados a un proyecto sin eliminar ProjectSchemes.