0

条件が満たされない場合、INNER JOIN を「短絡」しようとしています。

私が試し
たこと:「ON」条件でLeft Joinの前にFalse句があると、LEFT JOINが失敗することがわかりました。したがって、LEFT OUTER JOIN を使用して INNER JOIN をシミュレートしようとしましたが、WHERE 句は次のような実行計画を取得しました。

DECLARE @a nvarchar(4) = 'All'

SELECT A.*
FROM [dbo].[your_table] A
LEFT JOIN [dbo].[your_table_2] B
     ON @a <> 'All'
WHERE A.City_Code = CASE WHEN @a <> 'All' 
                    THEN B.City_Code 
                    ELSE A.City_Code END

これにより、左の結合が「短絡」され、発生することはありません。実行計画は次のとおりです。

ここに画像の説明を入力

しかし、変数を「All」ではなく「Al」として宣言して同じステートメントを実行しようとすると、実行計画が同じであることがわかりました。

ここに画像の説明を入力

Join が最初のステップで発生したかどうか、私は困惑していますか?

私が欲しいもの:
上記のアプローチが正しいかどうか知りたいですか?それは本当にINNER JOINを短絡していますか?
私は基本的に、変数が「すべて」ではない場合にのみ、2つのテーブル間でINNER JOINが発生するようにしたいと考えています。「OR」(短絡する) と「IN」(フィルターを適用する) を使用して既に試しましたが、IN 句に項目が多すぎるとパフォーマンスが低下します。
私を助けて、私のアプローチのどこかが間違っていたら教えてください。

サンプルデータ:

変数 <> 'all' の場合にのみ、INNER JOIN の結果を取得する必要があります ここに画像の説明を入力

variable = 'All' の場合、テーブル A を取得する必要があります。

ここに画像の説明を入力

注:このクエリを簡略化したので、単純な if ステートメントで実行できるように見えます。実際には、JOINS を確認して実行する必要がある 53 個のパラメーターがあります。さらに、あるクエリの結果セットを別のクエリと結合する必要があります。つまり、これに先行する他のいくつかの結合条件があります:)

4

2 に答える 2

0

次のようなことを試しましたか

SELECT  A.*
FROM    [dbo].[your_table] A
WHERE   EXISTS  (
            SELECT  1
            FROM    [dbo].[your_table_2] B
            WHERE   A.City_Code = B.City_Code
        )
OR  @a = 'All'
于 2013-06-15T08:45:28.573 に答える