外连接或动态查询,这是最好的方法吗?

时间:2009-08-18 04:41:35

标签: sql inner-join dynamic-sql outer-join

我有以下表格(我简化了表格中包含的数据)。

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,并列出汽油附加费,管理费和商品及服务税。

这是正常的目的。将显示包含匹配记录的值列表,并仅针对rate_extra_name查询RateExtra。

所以我可能会得到以下结果:

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

我被要求修改它,以便现在返回的每条记录都包含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数据链接到将返回null的RateTableExtra。我现在正在考虑创建一个动态查询来获取我的原始结果集,迭代检查rate_extra_id,如果它还没有在结果集中,则在需要它的情况下将NULL数据附加到结果中。我认为这会有效,但我觉得它会成为性能的杀手。

有没有更好的方法呢?希望有人能提供帮助,真的很感激。

1 个答案:

答案 0 :(得分: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表中的哪些组合。

小心笛卡尔连接。对于尺寸合理的桌子,它们可以很快失控! 享受!