2

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
    )
4

4 に答える 4

1

これをしないでください!

(少なくともパフォーマンスを気にする場合はそうではありません)

確かにこれを行う方法はありますが、実際にはそうすべきではありません。その理由は、(一般に) 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 つのテーブルの違いによっては、これでうまくいく場合もあれば、恐ろしくうまくいかない場合もあります。

たとえば、ATable1行しか含まれていない場合、TeamTableすべてのIDが含まれている場合、SQLサーバーはルックアップ( を使用する場合に最適)とテーブルスキャン( を使用する場合に最適)My_Tableのどちらを実行するかを選択/妥協する必要があります。 SQL サーバーは、最適な実行計画を使用して両方のクエリを実行できます (両方の実行計画がたまたま同じでない限り)。ATableTeamTable

代わりに 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 のリストを一時テーブルに選択した方がよい場合があります。

于 2010-02-16T13:06:40.737 に答える