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

<> срещу НЕ ВЪВ

SELECT something
FROM someTable
WHERE idcode NOT IN (SELECT ids FROM tmpIdTable)

проверява всяка стойност в списъка.

Но NOT IN не е толерантен към NULL. Ако подзаявката върне набор от стойности, които съдържат NULL, няма да бъдат върнати никакви записи. (Това е така, защото вътрешно NOT IN е оптимизиран за idcode <> 'foo' AND idcode <> 'bar' AND idcode <> NULL и т.н., което винаги ще се провали, защото всяко сравнение с NULL дава UNKNOWN, предотвратявайки целия израз да стане TRUE.)

По-хубав, толерантен към NULL вариант би бил този:

SELECT something
FROM someTable
WHERE NOT EXISTS (SELECT ids FROM tmpIdTable WHERE ids = someTable.idcode)

РЕДАКТИРАНЕ:Първоначално предположих, че това:

SELECT something
FROM someTable
WHERE idcode <> (SELECT ids FROM tmpIdTable)

ще провери само срещу първата стойност. Оказва се, че това предположение е погрешно поне за SQL Server, където всъщност задейства неговата грешка:

Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.


  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. Свържете LINQPad към отдалечен SQL Server

  3. Не разбирам поведението на закръгляване в sql сървър при използване на оператор за деление

  4. SQL, въпроси относно присъединяването

  5. Как да разделя низ с помощта на разделител char с T-SQL?