sql >> Database >  >> RDS >> Sqlserver

NOT IN (subquery) die nul rijen produceert

Als b nullable is, is dit geen bug. Het probleem is dat SQL Server NOT IN wordt in een reeks van <> 1 AND <> 2 AND <> 3 enz. Als u <> NULL . heeft , die onbekend retourneert, wat in dit geval false betekent. In verschillende scenario's kan dit ALLE kwalificeren of diskwalificeren rijen. In plaats van de LEFT JOIN aanpak, zou je moeten zeggen:

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

Hier is een korte demonstratie:

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

Voor veel meer details (en statistieken om te bewijzen waarom NOT EXISTS is het beste alternatief):

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

Lees ook deze blogpost van Gail Shaw:

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



  1. Msql:groei in de loop van de tijd tellen

  2. Bash-script om waarden in MySQL in te voegen

  3. Mysql join vanuit meerdere tabellen

  4. Hoe een procedure aan te roepen die dezelfde tabel gebruikt na trigger?