sql >> データベース >  >> RDS >> Sqlserver

2つの値のNULL比較を単純化する方法はありますか

    はい、できます。オプティマイザーにも認識させることができます。

    PaulWhiteにはこのちょっとした問題があります

    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フィードバック 適切な演算子を実装する



    1. PostgreSQL用のマルチデータセンターセットアップの実装-パート1-

    2. pg_restore:[アーカイバ]ファイルヘッダーでサポートされていないバージョン(1.13)

    3. phpMyAdminが#2002をスローしていますmysqlサーバーにログインできませんphpmyadmin

    4. 一致する文字列タグをクエリする