Há uma pegadinha notória para
not in . Basicamente, id not in (1,2,3) é abreviação para:id <> 1 and id <> 2 and id <> 3
Agora, se o seu
TimeEntries tabela contém qualquer linha com um TaskID de null , o not in traduz para:ID <> null and ID <> 1 and ID <> 2 AND ...
O resultado de uma comparação com
null é sempre unknown . Como unknown não é verdade em SQL, o where cláusula filtra todas as linhas e você acaba não excluindo nada. Uma correção fácil é uma cláusula where adicional na subconsulta:
DELETE FROM Tasks
WHERE ID not IN
(
SELECT TaskID
FROM TimeEntries
WHERE TaskID is not null
)