Delete con inner join en SQL Server

En SQL Server, para eliminar registros de una tabla siguiendo un criterio que tenga relación con otra tabla de la base de datos se puede establecer una join entre ambas tablas en la misma instrucción SQL de Delete.

Es algo muy parecido al método para hacer un update a partir de una join para actualizar registros en función de valores de otras tablas, pero en este caso, al tratarse de eliminar registros en lugar de actualizar, la sintaxis SQL cambia un poco.

Si queremos hacer un delete de registros utilizando una join lo único que hay que hacer es especificar en la primera linea de la sentencia la tabla o tablas en las que se quiere aplicar la eliminación de registros, y en la siguiente linea, comenzando con un FROM, la join de las tablas que necesitemos, y el criterio indicado con un WHERE.

Ejemplo SQL de Delete con Inner join

Un ejemplo sencillo de un delete con una join entre tablas para aplicar el criterio de borrado:

DELETE TablaConRegistrosAEliminar
       FROM TablaConRegistrosAEliminar TDel INNER JOIN TablaParaCriterioDeEliminacion TFiltro
            ON TDel.idCampo_fk=TFiltro.idCampo_pk
       WHERE TFiltro.criterio='Valor para filtrar'

 

Delete con Outer Join para eliminar registros sin referencias en otra tabla

Esta opción de utilizar una inner join para eliminar registros se puede utilizar con todos los tipos de join, de manera que si se combina con una outer join, por ejemplo, es muy útil para eliminar registros de una tabla cuyo identificador no se encuentre en otra tabla, es decir, registros de una tabla que no tengan correspondencia, o no existan en otra.
Sólo hay que hacer una left join con la tabla en la que tenemos los identificadores de referencia y todos los registros resultantes que tengan un valor nulo para la tabla enlazada son los que ese valor no está en la segunda tabla, es decir, los que queremos eliminar de la primera.

Como siempre, con un ejemplo de SQL para borrado de registros que no existen en otra tabla se entenderá mejor:

DELETE TablaConRegistrosAEliminar
       FROM TablaConRegistrosAEliminar TDel LEFT JOIN TablaConRegistrosBuenos TMaestra
            ON TDel.idCampo_fk=TMaestra.idCampo_pk
       WHERE TMaestra.idCampo_pk IS NULL

 

Delete con join sobre varias tablas para borrado de registros en cascada

En muchos casos puede interesar eliminar los registros de la tabla inicial, y también los registros de la tabla con la que se hace la join para establecer el criterio de selección. Sería algo así como una eliminación en cascada de los registros de ambas tablas.

Para eliminar a la vez todos los registros de ambas tablas, o más bien para hacer el delete de registros de varias tablas a la vez lo único que hay que hacer es incluir en la primera línea de la sentencia las tablas de las que se quiere eliminar los registros.

Para el ejemplo SQL de delete anterior, si quisiéramos borrar también los registros de la tabla 'enlazada' en la inner join para hacer una eliminación en cascada sólo habría que incluir la segunda tabla en la línea DELETE, de esta manera:

DELETE TablaConRegistrosAEliminar, TablaParaCriterioDeEliminacion
       FROM TablaConRegistrosAEliminar TDel INNER JOIN TablaParaCriterioDeEliminacion TFiltro
            ON TDel.idCampo_fk=TFiltro.idCampo_pk
       WHERE TFiltro.criterio='Valor para filtrar'