2009-08-18 52 views
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只包含3鍵的1,2 & 3名汽油附加費,管理費和消費稅值。

這是正常工作,因爲它是目前的目的。值列表正在顯示匹配的記錄,RateExtra僅針對rate_extra_name進行查詢。

因此,我可以具有以下結果:

  • Ratetable1,1,PetrolSurcharge
  • Ratetable1,2,ManagementFee
  • Ratetable2,3,PetrolSurcharge
  • Ratetable4,4,GST
  • Ratetable6,5,PetrolSurcharge

I'v e被要求修改,以便每個返回的記錄現在包含RateExtra表中每個值的記錄。如果沒有匹配的記錄,那麼來自我的RateTableExtra表的數據應該返回爲NULL。所以,我的數據應該回來爲:

  • Ratetable1,1,PetrolSurcharge
  • Ratetable1,2,ManagementFee
  • Ratetable1,NULL,GST
  • Ratetable2,3,PetrolSurcharge
  • Ratetable2,NULL, ManagementFee
  • Ratetable2,NULL,GST
  • Ratetable4,NULL,PetrolSurcharge
  • Ratetable4,NULL,ManagementFee
  • Ratetable4,4,GST
  • Ratetable6,5,PetrolSurcharge
  • Ratetable6,NULL,ManagementFee
  • Ratetable6,NULL,GST

我試過OUTER連接但他們似乎沒有工作,我假設因爲RateExtra數據鏈接到RateTableExtra將返回null。我現在正在考慮創建一個動態查詢,它將獲得我的原始結果集,對它進行迭代檢查rate_extra_id,如果它不在結果集中,則在需要時使用NULL數據向結果附加新行。我假設這會起作用,但我有一種感覺,它會成爲性能上的殺手。

有沒有更好的方法來做到這一點?希望有人能幫助,這將是非常感激。

+0

如果您通過正確加入使RateTableExtra成爲可選項,則必須通過正確加入來使RateExtra成爲可選項。事實上,沒有額外收費的情況下,推定額外收費的理由是沒有意義的。 Jacob – TheJacobTaylor 2009-08-18 04:47:33

回答

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 

什麼你這個查詢得到的是,本質上,笛卡爾加入RateTableRateExtra之間,具有left join找到RateTableExtra匹配成對的值。實質上,此查詢將帶回所有可能的RateTableRateExtra的組合,並快速向您顯示RateTableExtra表中的哪些。

小心笛卡爾聯接。他們可以通過合理大小的桌子非常快地失控! 享受!

+0

您忘記了RateTableUsed,但沒關係,只需將它放在「from」(RateTableUsed rtu內部連接RateTable rt on ...)之後即可。 「order by」無效 - 將其更改爲「re.rate_extra_id」。 – 2009-08-18 05:11:03

+1

@Todd:我已經命名了'RateTableUsed ru',而不是'rtu',所以我的不好。至於'按'順序,它確實有效果。否則,'rate_table_name'將會失去作用。但是,它應該是'rt.rate_table_name,re.rate_extra_id'命令,所以非常感謝! – Eric 2009-08-18 05:18:09

+1

用沒有ON子句的CROSS JOIN代替INNER JOIN來編碼笛卡爾連接會更清楚。ON 1 = 1。 – 2009-08-18 06:55:15

相關問題