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

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、消费税
  • Ratetable6,5,PetrolSurcharge

我已经要求修改这使得每一个记录,返回现在包括记录中的每一个值RateExtra表。如果没有匹配的记录,然后将数据从我RateTableExtra表应该回来为空。所以我的数据应该回来为:

  • 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、消费税
  • Ratetable6,5,PetrolSurcharge
  • Ratetable6,NULL,ManagementFee
  • Ratetable6,NULL,GST

我已经试过外联接,但他们似乎不能工作我假设因为RateExtra数据链接到RateTableExtra其将返回的空。我现在考虑建立一个动态查询,将得到我原来的结果集中,迭代过检查rate_extra_id和,如果它不是已经在结果、附加一个新的行为的结果与空数据在哪里我需要它。我假设这会的工作但是我有感觉这会是一个杀手在性能。

是否有更好的方式来做到这个吗?希望有人可以帮助,这会是真正的赞赏。

有帮助吗?

解决方案

试试这个:

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 表迅速。

小心笛卡尔加入。他们可以得出的一方面非常迅速地与合理的尺寸的表!享受!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top