我有以下表格(我简化了表格中包含的数据)。
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。
所以我可能会得到以下结果:
我被要求修改它,以便现在返回的每条记录都包含RateExtra表中每个值的记录。如果没有匹配的记录,那么来自我的RateTableExtra表的数据应该返回NULL。所以我的数据应该回复为:
我已经尝试过OUTER连接,但它们似乎没有工作我正在假设,因为RateExtra数据链接到将返回null的RateTableExtra。我现在正在考虑创建一个动态查询来获取我的原始结果集,迭代检查rate_extra_id,如果它还没有在结果集中,则在需要它的情况下将NULL数据附加到结果中。我认为这会有效,但我觉得它会成为性能的杀手。
有没有更好的方法呢?希望有人能提供帮助,真的很感激。
答案 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
您使用此查询获得的内容实际上是RateTable
和RateExtra
之间的笛卡尔联接,left join
可以找到匹配的RateTableExtra
值那些对。从本质上讲,此查询会带回 RateTable
和RateExtra
的所有可能组合,并快速显示您RateTableExtra
表中的哪些组合。
小心笛卡尔连接。对于尺寸合理的桌子,它们可以很快失控! 享受!