この質問の重要な部分は、「最適に」は最速の戻り時間を意味します。私はいくつかのテーブルを持っています。私は、情報を得る最速の方法が何であるかを判断しようとしているだけで、クエリ自体を書くのに何の問題もありません。複数のテーブルからレコードを最適に取得する方法
- 監査(これは私がからの情報が欲しい主テーブルである)
- 注文(残りは私がからの限られたデータをするテーブルです)
- ジョブズ
- クレジット
事彼ら共通の共有はアカウントであり、従ってAccountIDである。私は前もって探していたAccountIDを持っています。残念なことに、監査テーブルは、問題のアカウントテーブルに直接外部キーを持たないため、監査レコードが私の結果セットに属しているかどうかを判断するために、監査テーブルとその後の3つのテーブルに一度に1つずつ参加する必要があります監査レコードが自分のAccountIDに関連しているかどうかを確認します。
は例
Select a.* from [Audits] a JOIN [Orders] o ON a.RecordID = o.OrderID
where a.RecordType = 'Order' and o.AccountID = @AccountID
union
select a.* from [Audits] a JOIN [Jobs] j on a.RecordID = j.JobID
where a.RecordType = 'Job' and j.AccountID = @AccountID
...
のために私は、データの第1のサブセットに次のフェッチと私が最初に制限されたヒットをやっているように、二次テーブルからの情報を記入するつもり。私はこれを2つの部分の問題として見ています。まず、私のサブセットに属するAuditIDを見つける最速の方法と、欠落したデータを埋めるための最速の方法です。任意の提案をいただければ幸いです。ので、私はここに投稿するつもりです私は今のソリューションを作ってみたが、それを最適化する任意の簡単な方法があるかどうか、私は知ることに興味があると思い
EDIT 1
問題をさらに明確にするのに役立つと考えています。構文エラーが発生した場合は無視してください。できるだけ多くの不要な情報を削除しようとしています。
私が必要とする20個のレコードを取得し、一致すると同時に1つずつ入力します。
「Audit」テーブルの「RecordID」フィールドは、Order、Job、またはCreditのいずれかになります。彼らが共有する唯一のものは「AccountID」フィールドです。 –
それは見た目...楽しいです。頭に浮かぶことは、 'union'の代わりに' union all'を使うことです。それは 'union'から余分な並べ替えと重複をスキップします。 – SqlZim
使用しているSQL Serverのバージョンとエディションは何ですか? 'select @@ version' – SqlZim