我有以下表格(我已经简化了表格中包含的数据)。
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 以及名称的汽油附加费、管理费和 GST。
这对于目前的目的来说工作正常。正在显示具有匹配记录的值列表,并且仅针对 rate_extra_name 查询 RateExtra。
所以我可能有以下结果:
- Ratetable1, 1, 汽油附加费
- Ratetable1, 2, 管理费
- Ratetable2, 3, 汽油附加费
- Ratetable4, 4, GST
- Ratetable6, 5, 汽油附加费
我被要求对此进行修改,以便现在返回的每条记录都包含 RateExtra 表中每个值的记录。如果没有匹配的记录,那么我的 RateTableExtra 表中的数据应该返回为 NULL。所以我的数据应该返回为:
- Ratetable1, 1, 汽油附加费
- Ratetable1, 2, 管理费
- Ratetable1,NULL,GST
- Ratetable2, 3, 汽油附加费
- Ratetable2,NULL,管理费
- Ratetable2,NULL,消费税
- Ratetable4, NULL, PetrolSurcharge
- Ratetable4,NULL,管理费
- Ratetable4, 4, GST
- Ratetable6, 5, 汽油附加费
- Ratetable6, NULL, ManagementFee
- Ratetable6, NULL, GST
我已经尝试过 OUTER 连接,但我假设它们似乎不起作用,因为 RateExtra 数据链接到将返回 null 的 RateTableExtra。我现在正在考虑创建一个动态查询,该查询将获取我的原始结果集,对其进行迭代检查 rate_extra_id,如果它不在结果集中,则在我需要的带有 NULL 数据的结果中附加一个新行。我假设这会起作用,但我有一种感觉,它会成为性能的杀手。
有没有更好的方法来做到这一点?希望有人可以提供帮助,将不胜感激。