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
)