C'è un famigerato trucco per not in . Fondamentalmente, id not in (1,2,3) è l'abbreviazione di:
id <> 1 and id <> 2 and id <> 3
Ora se il tuo TimeEntries la tabella contiene qualsiasi riga con un TaskID di null , il not in si traduce in:
ID <> null and ID <> 1 and ID <> 2 AND ...
Il risultato di un confronto con null è sempre unknown . Poiché unknown non è vero in SQL, il where La clausola filtra tutte le righe e finisci per non eliminare nulla.
Una soluzione semplice è una clausola where aggiuntiva nella sottoquery:
DELETE FROM Tasks
WHERE ID not IN
(
SELECT TaskID
FROM TimeEntries
WHERE TaskID is not null
)