私は重複を減らしたいという衝動と戦うべきです...しかし、男、それは本当に私には正しく感じられません。
これは「気分」が良くなるでしょうか?
SELECT...たくさんの列と複雑なもの..。
から
((
MyPKを選択
TBooksから
どこ
(--...いくつかの条件)
AND @AuthorType = 1 AND --...さまざまな条件)
ユニオンオール
MyPKを選択
TBooksから
どこ
(--...いくつかの条件)
AND @AuthorType = 2 AND --...さまざまな条件)
ユニオンオール
..。
)AS B1
TBooksをB2として参加する
ON B2.MyPK = B1.MyPK
JOIN...他のテーブル..。
疑似テーブルB1は、PKを取得するための単なるWHERE句です。次に、それを元のテーブル(および必要なその他のテーブル)に結合して、「プレゼンテーション」を取得します。これにより、すべてのUNIONALLでプレゼンテーション列が重複することを回避できます。
これをさらに一歩進めて、最初に一時テーブルにPKを挿入してから、プレゼンテーションの側面で他のテーブルに結合することができます。
これは、ユーザーが何を照会するかについて多くの選択肢がある非常に大きなテーブルに対して行います。
@MyTempTableテーブルを宣言します
((
MyPK int NOT NULL、
主キー
((
MyPK
)。
)。
@LastNameがNULLでない場合
始める
@MyTempTableに挿入
((
MyPK
)。
MyPKを選択
FROM MyNamesTable
WHERE LastName=@LastName-これに効率的なインデックスがあるとしましょう
終わり
そうしないと
@CountryがNULLでない場合
始める
@MyTempTableに挿入
((
MyPK
)。
MyPKを選択
FROM MyNamesTable
WHERE Country=@Country-これにもインデックスがあります
終わり
...など
SELECT...プレゼンテーション列
FROM @MyTempTable AS T
MyNamesTableASNに参加する
ON N.MyPK = T.MyPK-PK参加、V。効率的
JOIN...他のテーブル..。
オン ....
WHERE(@LastName IS NULL OR Lastname @LastName)
AND(@Country IS NULL OR Country @Country)
@MyTempTableを作成するための元のフィルターになかった(たとえば)あいまいなテストを含め、すべてのテストが繰り返されることに注意してください[技術的には@Lastnameのものは必要ありません:)]。
@MyTempTableの作成は、使用可能なパラメーターを最大限に活用するように設計されています。おそらく、@ LastNameと@Countryの両方が利用可能であり、どちらか一方よりもテーブルへの入力がはるかに効率的である場合は、そのシナリオのケースを作成します。
スケーリングの問題?実際に行われているクエリを確認し、改善できるケースを追加します。