Es gibt einen berüchtigten Fallstrick für not in . Grundsätzlich ist id not in (1,2,3) ist eine Abkürzung für:
id <> 1 and id <> 2 and id <> 3
Wenn nun Ihre TimeEntries Tabelle enthält eine beliebige Zeile mit einer TaskID von null , der not in übersetzt zu:
ID <> null and ID <> 1 and ID <> 2 AND ...
Das Ergebnis eines Vergleichs mit null ist immer unknown . Da unknown in SQL nicht wahr ist, das where -Klausel filtert alle Zeilen heraus, und am Ende wird nichts gelöscht.
Eine einfache Lösung ist eine zusätzliche where-Klausel in der Unterabfrage:
DELETE FROM Tasks
WHERE ID not IN
(
SELECT TaskID
FROM TimeEntries
WHERE TaskID is not null
)