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

NOT IN (podzapytanie) dające zero wierszy

Jeśli b jest nullable, to nie jest błąd. Problem polega na tym, że SQL Server włącza NOT IN w serię <> 1 AND <> 2 AND <> 3 itp. Jeśli masz <> NULL , który zwraca nieznany, co w tym przypadku oznacza fałsz. W różnych sytuacjach może to kwalifikować lub dyskwalifikować WSZYSTKIE wydziwianie. Zamiast LEFT JOIN podejście, powinieneś powiedzieć:

FROM dbo.OuterTable AS t
WHERE NOT EXISTS (SELECT 1 FROM x WHERE b = t.a);

Oto krótka demonstracja:

DECLARE @x TABLE(i INT);
INSERT @x VALUES(1),(2);

DECLARE @y TABLE(j INT);
INSERT @y VALUES(2),(NULL);

SELECT i FROM @x WHERE i NOT IN -- produces zero results
  (SELECT j FROM @y);

SELECT i FROM @x  AS x WHERE NOT EXISTS -- produces one result
  (SELECT 1 FROM @y WHERE j = x.i);

Aby uzyskać więcej szczegółów (i metryki, aby udowodnić, dlaczego NOT EXISTS) to najlepsza alternatywa):

http://www.sqlperformance.com /2012/12/t-sql-queries/left-anti-semi-join

Przeczytaj także ten wpis na blogu autorstwa Gail Shaw:

http://sqlinthewild. co.za/index.php/2010/02/18/not-exists-vs-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. Zaktualizuj pole XML bez tekstu w T-SQL

  2. T-SQL Jak nadać rolę użytkownikowi

  3. łańcuchowy odpowiednik sumy do konkatenacji

  4. Dodaj kolumnę do tabeli, a następnie zaktualizuj ją w transakcji

  5. 6 sposobów sprawdzania rozmiaru bazy danych w SQL Server za pomocą T-SQL