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 以及名称的汽油附加费、管理费和 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 数据的结果中附加一个新行。我假设这会起作用,但我有一种感觉,它会成为性能的杀手。

有没有更好的方法来做到这一点?希望有人可以提供帮助,将不胜感激。

4

1 回答 1

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

从本质上讲,您使用此查询得到的是 and 之间的笛卡尔连接,RateTableRateExtra使用 aleft join来查找RateTableExtra与这些对匹配的值。从本质上讲,这个查询带回了 和 的所有可能组合,RateTable并快速RateExtra向您显示您的RateTableExtra表中有哪些组合。

小心笛卡尔连接。使用合理大小的桌子,他们可以很快失控!享受!

于 2009-08-18T04:45:28.017 回答