外部結合と動的クエリ、どちらが最適ですか?
-
18-09-2019 - |
質問
次の表があります (表に含まれるデータは簡略化しています)。
RateTable
- rate_table_id [int]
- rate_table_name [nvarchar(50)]
RateTableUsed
- rate_used_id [int]
- rate_table_id [int] (key to RateTable.rate_table_id)
- customer_id [int]
RateTableExtra
- rate_table_extra_id [int]
- rate_ extra_id [int] (key to RateExtra.rate_table_id)
- rate_used_id [int] (key to RateTableUsed.rate_used_id)
RateExtra
- rate_ extra_id [int]
- rate_extra_name [nvarchar(50)]
select rate_table_name, rate_table_extra_id, rate_extra_name from RateTableUsed rtu
innerjoin RateTable rt on rtu.rate_table_id = rt.rate_table_id
innerjoin RateTableExtra rte on rte.rate_table_id = rt.rate_table_id
innerjoing RateExtr re on rte.rate_extra_id = re.rate_extra_id
RateExtra には、キーの 1、2、3 と名前のガソリン追加料金、管理手数料、GST を含む 3 つの値のみが含まれます。
これは現在の目的ではうまく機能しています。値のリストが一致するレコードとともに表示され、RateExtra は rate_extra_name についてのみクエリされます。
したがって、次のような結果が得られる可能性があります。
- 料金表1、1、ガソリン割増料金
- 料金表1、2、管理手数料
- 料金表2、3、ガソリン割増料金
- 料金表4、4、GST
- 料金表6、5、ガソリン割増料金
これを変更して、返される各レコードに RateExtra テーブルの各値のレコードが含まれるようにするように依頼されました。一致するレコードがない場合、RateTableExtra テーブルのデータは NULL として返されるはずです。したがって、私のデータは次のように返されるはずです。
- 料金表1、1、ガソリン割増料金
- 料金表1、2、管理手数料
- Ratetable1、NULL、GST
- 料金表2、3、ガソリン割増料金
- Ratetable2、NULL、ManagementFee
- Ratetable2、NULL、GST
- 料金表4、NULL、ガソリン追加料金
- Ratetable4、NULL、ManagementFee
- 料金表4、4、GST
- 料金表6、5、ガソリン割増料金
- Ratetable6、NULL、ManagementFee
- Ratetable6、NULL、GST
OUTER 結合を試しましたが、RateExtra データが null を返す RateTableExtra にリンクされているため、機能していないようです。現在、元の結果セットを取得し、rate_extra_id を確認して反復処理し、結果セットにまだ存在しない場合は、必要な場所に NULL データを含む新しい行を結果に追加する動的クエリを作成することを検討しています。これはうまくいくと思いますが、パフォーマンスが大幅に低下するような気がします。
これを行うより良い方法はありますか?誰かが助けてくれることを願っています、それは本当に感謝します。
解決
これを試してください:
select
rate_table_name,
rate_table_extra_id,
rate_extra
from
RateTableUsed rtu
inner join RateTable rt on
rtu.rate_table_id = rt.rate_table_id
cross join RateExtra re
left outer join RateTableExtra rte on
rte.rate_table_id = rt.rate_table_id
and rte.rate_extra_id = re.rate_extra_id
order by rt.rate_table_name, re.rate_extra_id
あなたはこのクエリとなっているのは、基本的に、デカルトは、それらのペアに一致するRateTable
の値を見つけるためRateExtra
で、left join
とRateTableExtra
の間で参加しています。基本的に、このクエリはRateTable
とRateExtra
ののすべての可能なの組み合わせを戻す、とあなたはすぐにあなたのRateTableExtra
テーブルに持っているもの、あなたを見せています。
デカルトが参加して注意してください。彼らは、適度なサイズのテーブルを非常に迅速に手に負えなくなることができます! お楽しみください!