Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

NOT IN (Unterabfrage) erzeugt null Zeilen

Wenn b nullable ist, ist dies kein Fehler. Das Problem besteht darin, dass SQL Server zu NOT IN wird in eine Reihe von <> 1 AND <> 2 AND <> 3 usw. Wenn Sie <> NULL haben , die unknown zurückgibt, was in diesem Fall false bedeutet. In verschiedenen Szenarien kann dies ALLE qualifizieren oder disqualifizieren Reihen. Anstelle des LEFT JOIN Ansatz, sollten Sie sagen:

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

Hier ist eine kurze 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 viele weitere Details (und Metriken, um zu beweisen, warum NOT EXISTS ist die beste Alternative):

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

Bitte lesen Sie auch diesen Blogbeitrag von Gail Shaw:

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