b
の場合 これはバグではありません。問題は、SQL Server が NOT IN
になることです。 一連の <> 1 AND <> 2 AND <> 3
に など <> NULL
がある場合 、この場合は false を意味する unknown を返します。さまざまなシナリオで、これは ALL の資格または不適格となる可能性があります 行。 LEFT JOIN
ではなく 次のように言う必要があります:
FROM dbo.OuterTable AS t WHERE NOT EXISTS (SELECT 1 FROM x WHERE b = t.a);
プレ>ここに簡単なデモンストレーションがあります:
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);
プレ>詳細 (および
NOT EXISTS
の理由を証明する指標) については、 が最良の代替手段です):http://www.sqlperformance.com /2012/12/t-sql-queries/left-anti-semi-join
また、Gail Shaw によるこのブログ投稿もお読みください:
http://sqlinthewild. co.za/index.php/2010/02/18/not-exists-vs-not-in/