Existuje jeden notoricky známý problém pro not in
. V podstatě id not in (1,2,3)
je zkratka pro:
id <> 1 and id <> 2 and id <> 3
Nyní, pokud vaše TimeEntries
tabulka obsahuje libovolný řádek s TaskID
z null
, not in
překládá do:
ID <> null and ID <> 1 and ID <> 2 AND ...
Výsledek porovnání s null
je vždy unknown
. Od unknown
není pravda v SQL, where
klauzule odfiltruje všechny řádky a nakonec nesmažete nic.
Snadnou opravou je další klauzule where v poddotazu:
DELETE FROM Tasks
WHERE ID not IN
(
SELECT TaskID
FROM TimeEntries
WHERE TaskID is not null
)