SQL Serverで次のことを行うにはどうすればよいですか
DECLARE @Local nvarchar(20)
SET @Local = 'True'
SELECT * FROM My_Table
WHERE my_ID IN
(IF @Local = 'True'
SELECT AllIDs FROM ATable
ELSE
SELECT TeamIDs FROM TeamTable
)
SQL Serverで次のことを行うにはどうすればよいですか
DECLARE @Local nvarchar(20)
SET @Local = 'True'
SELECT * FROM My_Table
WHERE my_ID IN
(IF @Local = 'True'
SELECT AllIDs FROM ATable
ELSE
SELECT TeamIDs FROM TeamTable
)
(少なくともパフォーマンスを気にする場合はそうではありません)
確かにこれを行う方法はありますが、実際にはそうすべきではありません。その理由は、(一般に) 1 つのステートメントには実行プランが 1 つしかないためですが、基本的に 2 つの (潜在的に非常に異なる) 要求があるためです。
SELECT * FROM My_Table
WHERE my_ID IN (SELECT AllIDs FROM ATable)
SELECT * FROM My_Table
WHERE my_ID IN (SELECT AllIDs FROM TeamTable)
これら 2 つのクエリを組み合わせると、SQL サーバーは 1 つの実行プランのみを使用して、これらの両方を同時に試行および最適化することを余儀なくされます。2 つのテーブルの違いによっては、これでうまくいく場合もあれば、恐ろしくうまくいかない場合もあります。
たとえば、ATable
1行しか含まれていない場合、TeamTable
すべてのIDが含まれている場合、SQLサーバーはルックアップ( を使用する場合に最適)とテーブルスキャン( を使用する場合に最適)My_Table
のどちらを実行するかを選択/妥協する必要があります。 SQL サーバーは、最適な実行計画を使用して両方のクエリを実行できます (両方の実行計画がたまたま同じでない限り)。ATable
TeamTable
代わりに 2 つのステートメントを使用する必要があります。
DECLARE @Local nvarchar(20)
SET @Local = 'True'
IF @Local = 'True'
SELECT * FROM My_Table
WHERE my_ID IN (SELECT AllIDs FROM ATable)
ELSE
SELECT * FROM My_Table
WHERE my_ID IN (SELECT AllIDs FROM TeamTable)
実際、この特定のケースでは、代わりに ID のリストを一時テーブルに選択した方がよい場合があります。