sql >> Databáze >  >> RDS >> Sqlserver

NOT IN (poddotaz) produkující nula řádků

Pokud b je nulovatelné, nejedná se o chybu. Problém je v tom, že SQL Server se NOT IN do řady <> 1 AND <> 2 AND <> 3 atd. Pokud máte <> NULL , který vrací neznámý, což v tomto případě znamená false. V různých scénářích to může kvalifikovat nebo diskvalifikovat VŠECHNY řádky. Spíše než LEFT JOIN přístup, měli byste říci:

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

Zde je rychlá ukázka:

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

Pro mnohem více podrobností (a metriky, které dokazují, proč NOT EXISTS je nejlepší alternativou):

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

Přečtěte si také tento blogový příspěvek od Gail Shaw:

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



  1. Lze zabránit Djangu ve zkracování dlouhých názvů tabulek?

  2. php funkce mysql s volitelným parametrem

  3. Ukládání více hodnot pro jedno pole v databázi

  4. Vypočítejte rozdíl mezi dvěma daty v hodinách a minutách