sql >> Databáze >  >> RDS >> Sqlserver

<> vs NOT IN

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

porovnává s jakoukoli hodnotou v seznamu.

NOT IN však nesnáší hodnotu NULL. Pokud dílčí dotaz vrátil sadu hodnot obsahujících NULL, nebudou vráceny vůbec žádné záznamy. (Je to proto, že vnitřně je NOT IN optimalizováno na idcode <> 'foo' AND idcode <> 'bar' AND idcode <> NULL atd., což vždy selže, protože jakékoli srovnání s hodnotou NULL vede k NEZNÁMÉMU, což zabrání tomu, aby se celý výraz stal PRAVDIVÝ.)

Hezčí varianta s tolerancí NULL by byla tato:

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

EDIT:Původně jsem předpokládal, že toto:

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

porovnává pouze s první hodnotou. Ukazuje se, že tento předpoklad je špatný přinejmenším pro SQL Server, kde ve skutečnosti spouští jeho chybu:

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. Použití MS Access &ODBC pro připojení ke vzdálenému PostgreSQL

  2. Oracle SQL:Použijte sekvenci v insert s příkazem Select

  3. jak zapsat číslo do funkce word na serveru SQL

  4. ModuleNotFoundError:Žádný modul s názvem 'pyodbc' při importu pyodbc do skriptu py