1

次の表があります (表に含まれるデータを単純化しました)。

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 データを含む結果に新しい行を追加することを検討しています。これでうまくいくと思いますが、パフォーマンスのキラーになると感じています。

これを行うより良い方法はありますか?誰かが助けてくれることを願っています。

4

1 に答える 1

1

これを試して:

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すばやく表示します。

デカルト結合には注意してください。適度なサイズのテーブルでは、すぐに手に負えなくなります。楽しみ!

于 2009-08-18T04:45:28.017 に答える