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

SQL NOT IN nie działa

SELECT foreignStockId
FROM   [Subset].[dbo].[Products]  

Prawdopodobnie zwraca NULL .

NOT IN zapytanie nie zwróci żadnych wierszy, jeśli jakikolwiek NULL s istnieje na liście NOT IN wartości. Możesz je wyraźnie wykluczyć, używając IS NOT NULL jak poniżej.

SELECT stock.IdStock,
       stock.Descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  stock.IdStock NOT IN (SELECT foreignStockId
                             FROM   [Subset].[dbo].[Products]
                             WHERE  foreignStockId IS NOT NULL) 

Lub przepisz używając NOT EXISTS zamiast tego.

SELECT stock.idstock,
       stock.descr
FROM   [Inventory].[dbo].[Stock] stock
WHERE  NOT EXISTS (SELECT *
                   FROM   [Subset].[dbo].[Products] p
                   WHERE  p.foreignstockid = stock.idstock) 

Oprócz semantyki, którą chcesz, aby plan wykonania dla NOT EXISTS jest często prostsze, jak pokazano tutaj.

Powodem różnicy w zachowaniu jest trzy wartościowa logika używana w SQL. Predykaty mogą mieć wartość True , False lub Unknown .

WHERE klauzula musi mieć wartość True aby wiersz został zwrócony, ale nie jest to możliwe w przypadku NOT IN kiedy NULL jest obecny, jak wyjaśniono poniżej.

'A' NOT IN ('X','Y',NULL) jest odpowiednikiem 'A' <> 'X' AND 'A' <> 'Y' AND 'A' <> NULL)

  • „A” <> „X” =True
  • „A” <> „Y” =True
  • 'A' <> NULL =Unknown

True AND True AND Unknown ocenia jako Unknown zgodnie z tabelami prawdy dla trzech wartości logiki.

Poniższe linki zawierają dodatkowe omówienie wydajności różnych opcji.

  • Czy powinienem użyć NOT IN , OUTER APPLY , LEFT OUTER JOIN , EXCEPT lub NOT EXISTS ?
  • NOT IN w porównaniu z NOT EXISTS a LEFT JOIN / IS NULL :Serwer SQL
  • Left outer join vs NOT EXISTS
  • NOT EXISTS w porównaniu z NOT IN


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przedstawiamy nową funkcję — raport dotyczący wzrostu bazy danych Spotlight Cloud

  2. Zwróć numer partycji dla każdego wiersza podczas wysyłania zapytań do tabeli partycjonowanej w SQL Server (T-SQL)

  3. Żądanie nie powiodło się lub usługa nie odpowiedziała na czas?

  4. Funkcja bezpieczeństwa Spotlight Cloud — usuń literały

  5. Jak połączyć wiele wierszy w listę rozdzielaną przecinkami w SQL Server 2005?