外加入或动态查询,这是最好的方式去吗?
-
18-09-2019 - |
题
我有以下表(我简化中包含的数据表)。
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
你得到什么与这个查询,从本质上讲,笛卡尔加入之间 RateTable
和 RateExtra
, , left join
找到价值观的 RateTableExtra
相匹配对。从本质上讲,这种查询带回 所有可能的 的组合 RateTable
和 RateExtra
, 和你展示它的,你有你的 RateTableExtra
表迅速。
小心笛卡尔加入。他们可以得出的一方面非常迅速地与合理的尺寸的表!享受!
不隶属于 StackOverflow