sql >> Database teknologi >  >> RDS >> Sqlserver

NOT IN (underforespørgsel), der producerer nul rækker

Hvis b er nullbar, er dette ikke en fejl. Problemet er, at SQL Server slår NOT IN i en serie af <> 1 AND <> 2 AND <> 3 osv. Hvis du har <> NULL , der returnerer ukendt, hvilket i dette tilfælde betyder falsk. I forskellige scenarier kan dette kvalificere eller diskvalificere ALLE rækker. I stedet for LEFT JOIN tilgang, bør du sige:

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

Her er en hurtig 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);

For mange flere detaljer (og målinger til at bevise, hvorfor NOT EXISTS er det bedste alternativ):

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

Læs også dette blogindlæg af Gail Shaw:

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



  1. Alligevel for at begrænse MySQL-forespørgselsudførelsestiden?

  2. Bestil efter alias i mysql indeholdt i if-forespørgsel

  3. Tilslutning til ekstern mysql fungerer i terminal, ikke via PHP PDO-script

  4. kodetænder dynamisk routing