質問

次の表があります (表に含まれるデータは簡略化しています)。

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 joinRateTableExtraの間で参加しています。基本的に、このクエリはRateTableRateExtraのすべての可能なの組み合わせを戻す、とあなたはすぐにあなたのRateTableExtraテーブルに持っているもの、あなたを見せています。

デカルトが参加して注意してください。彼らは、適度なサイズのテーブルを非常に迅速に手に負えなくなることができます! お楽しみください!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top