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
)