sql >> Database >  >> RDS >> Sqlserver

Elegante manier om rijen te verwijderen waarnaar niet wordt verwezen door een andere tabel

Er is één berucht probleem voor not in . Kortom, id not in (1,2,3) is een afkorting voor:

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

Als uw TimeEntries tabel bevat elke rij met een TaskID van null , de not in vertaalt naar:

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

Het resultaat van een vergelijking met null is altijd unknown . Sinds unknown is niet waar in SQL, de where clausule filtert alle rijen uit en u verwijdert uiteindelijk niets.

Een gemakkelijke oplossing is een aanvullende where-clausule in de subquery:

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


  1. Hoe kunnen we SQL-Injection van MySQL voorkomen?

  2. Combineer OUTPUT insert.id met waarde uit geselecteerde rij

  3. Hoe te testen in en tussen elk van de verschillende tafels?

  4. MySQL-tabelnamen in kleine letters in Windows-namen in hoofdletters op Unix