sql >> Databasteknik >  >> RDS >> Sqlserver

NOT IN (underfråga) ger nollrader

Om b är nullbar, detta är inte en bugg. Problemet är att SQL Server aktiverar NOT IN till en serie av <> 1 AND <> 2 AND <> 3 etc. Om du har <> NULL , som returnerar okänt, vilket i det här fallet betyder falskt. I olika scenarier kan detta kvalificera eller diskvalificera ALLA rader. Istället för LEFT JOIN tillvägagångssätt bör du säga:

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

Här är en snabb demonstration:

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);

För mycket mer information (och statistik för att bevisa varför NOT EXISTS är det bästa alternativet):

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

Läs också detta blogginlägg av Gail Shaw:

http://sqlinthewild. co.za/index.php/2010/02/18/not-exists-vs-not-in/



  1. Konvertera en sträng till en mySql DECIMAL-typ

  2. Ändra tabell:Hur man ändrar attributet 'Allow Nulls' från not null till att tillåta null

  3. SQL Server-markörtyper - KEYSET-markör | SQL Server Tutorial / TSQL Tutorial

  4. Framtvinga unika värden över två tabeller