条件が満たされない場合、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 個のパラメーターがあります。さらに、あるクエリの結果セットを別のクエリと結合する必要があります。つまり、これに先行する他のいくつかの結合条件があります:)