Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Modo elegante per eliminare le righe a cui non fa riferimento un'altra tabella

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
       )