如何合并Rate与RateHistory表,查询USD的新旧汇率值?
合并Rate与RateHistory的查询方案
实现思路
通过子查询锁定RateHistory中USD对应的最新移入记录(依据FROMSOURCEDATE字段取最大值),再与Rate主表关联,整合出当前汇率与历史最新汇率的组合结果。
最终SQL语句
基础子查询写法(兼容多数数据库)
SELECT r.CR, r.RATE AS NEWRATE, rh.RATE AS OLDRATE, rh.OPERATOR FROM Rate r LEFT JOIN ( SELECT CR, RATE, OPERATOR FROM RateHistory WHERE CR = 'USD' AND FROMSOURCEDATE = ( SELECT MAX(FROMSOURCEDATE) FROM RateHistory WHERE CR = 'USD' ) ) rh ON r.CR = rh.CR WHERE r.CR = 'USD';
窗口函数优化写法(支持窗口函数的数据库:MySQL 8.0+、SQL Server、Oracle等)
SELECT r.CR, r.RATE AS NEWRATE, rh.RATE AS OLDRATE, rh.OPERATOR FROM Rate r LEFT JOIN ( SELECT CR, RATE, OPERATOR, ROW_NUMBER() OVER (PARTITION BY CR ORDER BY FROMSOURCEDATE DESC) AS rn FROM RateHistory WHERE CR = 'USD' ) rh ON r.CR = rh.CR AND rh.rn = 1 WHERE r.CR = 'USD';
语句说明
- 基础写法:内层子查询先筛选出USD历史记录中移入时间最晚的那条,再与主表关联,确保只取最新的历史汇率数据。
- 窗口函数写法:通过
ROW_NUMBER()给USD的历史记录按移入时间倒序编号,取编号为1的最新记录,逻辑更清晰,适合多货币场景扩展。 - 使用
LEFT JOIN可以保证:即使历史表中无USD记录,主表的当前汇率信息仍能正常返回(此时OLDRATE和OPERATOR会显示为NULL)。
结果集字段说明
CR:货币代码,固定为'USD'NEWRATE:Rate主表中的USD当前汇率OLDRATE:RateHistory中最新移入的USD汇率OPERATOR:历史记录移入时的操作人
内容的提问来源于stack exchange,提问作者Dev
相关产品推荐
相关产品推荐

