Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Елегантен начин за изтриване на редове, които не са посочени от друга таблица

Има една прословута грешка за not in . По принцип id not in (1,2,3) е съкращение за:

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

Сега, ако вашите TimeEntries таблицата съдържа всеки ред с TaskID от null , not in се превежда на:

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

Резултатът от сравнение с null винаги е unknown . От unknown не е вярно в SQL, where клауза филтрира всички редове и в крайна сметка не изтривате нищо.

Лесна корекция е допълнителна клауза where в подзаявката:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Добавете колона към таблица със стойност по подразбиране, равна на стойността на съществуваща колона

  2. Обектът не може да бъде намерен, защото не съществува или нямате разрешения. Грешка в SQL Server

  3. Елиминиране на отклонения чрез стандартно отклонение в SQL Server

  4. Проблеми с израза MERGE на SQL Server

  5. SQL заявка за сумиране на данните