Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Maneira elegante de excluir linhas que não são referenciadas por outra tabela


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
       )