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

Manera elegante de eliminar filas a las que no hace referencia otra tabla

Hay un problema notorio para not in . Básicamente, id not in (1,2,3) es la abreviatura de:

id <> 1 and id <> 2 and id <> 3

Ahora, si sus TimeEntries la tabla contiene cualquier fila con un TaskID de null , el not in se traduce como:

ID <> null and ID <> 1 and ID <> 2 AND ...

El resultado de una comparación con null siempre es unknown . Desde unknown no es cierto en SQL, el where La cláusula filtra todas las filas y terminas sin eliminar nada.

Una solución fácil es una cláusula where adicional en la subconsulta:

DELETE FROM Tasks 
WHERE  ID not IN 
       (
       SELECT  TaskID 
       FROM    TimeEntries 
       WHERE   TaskID is not null
       )