sql >> Databasteknik >  >> RDS >> Sqlserver

Elegant sätt att ta bort rader som inte refereras av andra tabeller

Det finns en ökända gotcha för not in . I princip id not in (1,2,3) är en förkortning för:

id <> 1 and id <> 2 and id <> 3

Nu om dina TimeEntries tabellen innehåller valfri rad med ett TaskID av null , not in översätts till:

ID <> null and ID <> 1 and ID <> 2 AND ...

Resultatet av en jämförelse med null är alltid unknown . Sedan unknown är inte sant i SQL, where klausulen filtrerar bort alla rader och det slutar med att du inte raderar någonting.

En enkel fix är en extra where-sats i underfrågan:

DELETE FROM Tasks 
WHERE  ID not IN 
       (
       SELECT  TaskID 
       FROM    TimeEntries 
       WHERE   TaskID is not null
       )


  1. Skriver MySQL över en kolumn med samma värde vid uppdatering?

  2. Kerberos på C# Oracle Managed anslutning

  3. Hur släpper man alla tabeller från databasen med manage.py CLI i Django?

  4. Ta bort dubbletter i en MySQL-tabell