5

処方を利用するプロセスの例を見つけ続けています

WHERE a NOT IN (SELECT b FROM x)

間違っているように見えるゼロ行を返すだけです。NOT IN を IN に変更すると、逆 (すべての行) は返されません。実際には、a が null でないすべての行が除外されます。これは、何年もの間正常に実行され、変更されていない夜通しのルーチンで発生し始めています. SQL Server にバグがあるようです。

に再定式化することで問題を解決できます

LEFT JOIN x on a = b
WHERE b IS NULL

しかし、それは私が生きなければならないものではありません。

統計と関係があるのでしょうか?既知のバグ?最新の例では、サブクエリのテーブルはリモートのリンク サーバー上にありますが、これを見るたびにそうであったかどうかはわかりません。

4

2 に答える 2

11

nullable の場合b、これはバグではありません。問題は、SQL Server がNOT IN一連の<> 1 AND <> 2 AND <> 3etc<> NULLになることです。さまざまなシナリオで、これによりすべての行が適格または不適格となる可能性があります。アプローチではなく、次の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/

于 2013-10-23T15:03:23.050 に答える
0

動作の根本的な原因は、Aaron によって十分に説明されています。複数の方法で解決できます-LEFT JOIN、相関サブクエリを使用して、where句またはselect句からNULL値を除外することにより、内部クエリからNULL値をフィルタリングします-いくつか例を挙げます。

次の投稿は、同じ主題に関するケース スタディの一部です:- NOT IN サブクエリはゼロ行を返します-回避策

于 2014-03-08T15:13:03.220 に答える