次の表があります (表に含まれるデータを単純化しました)。
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、管理費
- Ratetable2、NULL、GST
- Ratetable4、NULL、PetrolSurcharge
- Ratetable4、NULL、管理費
- 料金表4、4、GST
- 料金表6、5、ガソリンサーチャージ
- Ratetable6、NULL、管理費
- Ratetable6、NULL、GST
OUTER 結合を試してみましたが、機能していないようです。RateExtra データが、null を返す RateTableExtra にリンクされているためだと思います。元の結果セットを取得する動的クエリを作成し、rate_extra_id を確認して反復し、結果セットにまだない場合は、必要な場所に NULL データを含む結果に新しい行を追加することを検討しています。これでうまくいくと思いますが、パフォーマンスのキラーになると感じています。
これを行うより良い方法はありますか?誰かが助けてくれることを願っています。