Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

<> a NIE W

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

sprawdza dowolną wartość na liście.

Jednak NOT IN nie toleruje wartości NULL. Jeśli podzapytanie zwróciło zestaw wartości, które zawierały NULL, żadne rekordy nie zostałyby zwrócone. (Dzieje się tak, ponieważ wewnętrznie NOT IN jest zoptymalizowane do idcode <> 'foo' AND idcode <> 'bar' AND idcode <> NULL itp., co zawsze się nie powiedzie, ponieważ każde porównanie z wartością NULL daje wynik NIEZNANE, uniemożliwiając, aby całe wyrażenie kiedykolwiek stało się PRAWDĄ).

Ładniejszy wariant tolerujący NULL byłby następujący:

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

EDYCJA:Początkowo zakładałem, że to:

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

sprawdzi tylko pierwszą wartość. Okazuje się, że to założenie jest błędne przynajmniej w przypadku SQL Server, gdzie faktycznie powoduje jego błąd:

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. BULK INSERT z kolumną tożsamości (auto-inkrementacja)

  2. Jaki jest najlepszy sposób na zaimplementowanie asocjacji polimorficznej w SQL Server?

  3. Określ rozmiar wiersza dla tabeli

  4. Usuń wszystkie rozszerzone właściwości na SQL Server

  5. Jak mogę powiadomić mój program o aktualizacji bazy danych?