はい、できます。オプティマイザーにも認識させることができます。
WHERE NOT EXISTS (
SELECT d.[Data]
INTERSECT
SELECT i.[Data])
これは、INTERSECT
のセマンティクスのために機能します nullを処理します。これが言うことは「ないある」ということです 値Bと値B"で構成されるサブクエリの行の場合、これは、値が異なるか、一方がnullで、もう一方がnullの場合にのみ満たされます。両方がnullの場合、nullの行があります。
XMLクエリプラン(SSMSのグラフィカルなプランではない)を確認すると、d.[Data] <> i.[Data]
までコンパイルされていることがわかります。 、ただし、使用する演算子にはCompareOp="IS"
があります。 EQ
ではありません 。
完全なプランを見る
計画の関連部分は次のとおりです。
<Predicate>
<ScalarOperator ScalarString="@t1.[i] as [t1].[i] = @t2.[i] as [t2].[i]">
<Compare CompareOp="IS">
<ScalarOperator>
<Identifier>
<ColumnReference Table="@t1" Alias="[t1]" Column="i" />
</Identifier>
</ScalarOperator>
<ScalarOperator>
<Identifier>
<ColumnReference Table="@t2" Alias="[t2]" Column="i" />
</Identifier>
</ScalarOperator>
</Compare>
</ScalarOperator>
</Predicate>
オプティマイザーは、EXISTS / EXCEPT
を実行するのではなく、この方法で非常にうまく機能することがわかりました。 。
Azureフィードバック 適切な演算子を実装する