0

このような条件付き結合を実現しようとしています

declare @JoinWithT2 bit = 1;

select T1.* from T1 
inner join T2 on (@JoinWithT2 = 0 or T1.Id=T2.Id)

値 1を渡す@JoinWithT2と、両方のテーブルの結合を使用して結果が得られ、@JoinWithT2値 0 を渡すと、結合を無視して T1 からのすべての結果が返されます。

これはすべてうまく機能していますが、上記もこのように達成できるため、パフォーマンスが心配です

if @JoinWithT2=0
begin
    select T1.* from T1 
end
else
begin
    select T1.* from T1 
    inner join T2 on (T1.Id=T2.Id)
end

条件付き結合を達成するための最良の方法は何ですか?最初の方法と2番目の方法は?

個人的には、最初のクエリが T2 を使用している可能性がある一方で、T2 をまったく使用しないため、2 番目のクエリの方がパフォーマンスが向上するはずだと感じています。

4

3 に答える 3

2

よくわかりません。以下は、 の値に応じて、デカルト積または内部結合のいずれかを実行する必要がありますJoinWithT2

declare @JoinWithT2 bit = 1;

select T1.*
from T1 inner join
     T2
     on (@JoinWithT2 = 0 or T1.Id=T2.Id);

その場合、句は常に真です@JoinWithT2。これにより、a と同等になります。0onjoincross join

以下は、結合を実行するか、最初のテーブルを取得するための条件付きロジックです。

declare @JoinWithT2 bit = 1;

select T1.*
from T1 left outer join
     T2
     on (@JoinWithT2 = 1 and T1.Id=T2.Id)
where @JoinWithT2 = 0 or T2.Id is not null;

パフォーマンスの観点からは、if通常、 の個別のステートメントの方がパフォーマンスが向上します。SQL エンジンが最適化するための詳細情報があります。ただし、 にインデックスがある場合T2(id)、クエリの他の部分 (ユーザーに結果を返すなど) と比較して、パフォーマンスの違いはそれほど大きくない可能性があります。

于 2013-07-25T19:10:39.703 に答える
1

これは、動的 SQL を使用するのが最善の選択である可能性が高いケースですが、新しいバージョンの SQL サーバーでは古いバージョンほど条件が悪くありません。if ステートメントは優れていますが、特定の条件に応じて結合される場合と結合されない場合がある 2 つまたは 3 つの他のテーブルを追加すると、維持が難しくなります。or 条件は、時間が経つにつれて遅くなり、クエリに追加されるものが増える可能性があります。この特定のパラメーターのセットに必要なものだけを使用して検索タイプのクエリを作成することが、多くの場合、最良の選択です。

あなたは読みたいかもしれません:

http://www.sommarskog.se/dyn-search-2008.html

または (SQL SERVER 2005 以前を使用している場合) http://www.sommarskog.se/dyn-search-2005.html

于 2013-07-25T19:15:36.577 に答える