我正在使用具有仅在特定日期内有效的值的汇率数据库。例如,如果我想将美元兑换为欧元,我必须使用特定日期内的特定汇率。汇率随着时间的推移而变化,最终将被另一个更新的汇率所取代。这里是汇率数据库我有一个样本:SQL技巧:在行之间的范围内查找值
Exchange_Rate_History
Valid-From Exchange-rate From-Currency To-Currency
2012-04-16 0.8 USD EUR
2012-04-18 0.82 USD EUR
2012-04-20 0.81 USD EUR
现在,如果你注意到了,我只有一个“有效起始”日期,但我没有一个“有效至”日期。
现在我有另一个需要连接到Exchange_Rate_History表的表。此表包含购物交易
Purchases
Transaction-ID Transaction-Date Amount-In-USD
1 2012-04-16 100
2 2012-04-17 100
因为我们有两个不同的日期,16日和17 2012年4月上述两项交易但我们需要使用被标记为有效起始2012-汇率两个日期04-16。由于我只有一个起始日期,我不能使用BETWEEN..AND来执行连接。因此下面的连接是不可能的
SELECT
*
FROM
Exchange_Rate_History
INNER JOIN Purchases ON (Purchases.Transaction-Date BETWEEN Exchange_Rate_History.Valid-From AND Exchange_Rate_History.???)
我想这样做一个让我得到两个有效起始列彼此未来自加入Exchange_Rate_History表(递归/自引用关系)。第一个有效来源是原始的,而第二个是垂直移动的。结果表是这样的:
Exchange_Rate_History
Valid-From Exchange-rate From-Currency To-Currency Valid-From-1 (aliased to Valid-To)
2012-04-16 0.8 USD EUR 2012-04-18
2012-04-18 0.82 USD EUR 2012-04-20
2012-04-20 0.81 USD EUR
我将要使用的有效起始-1场就好像它是一个有效的到现场,这样我可以执行上面的SQL语句。现在注意,Valid-From字段的日期是4月16日,而Valid-To是4月18日。然而在这个阶段,我不知道如何做垂直“转移”记录的递归关系!
请帮忙吗?这并不容易!
请不要强调SQL Server上的循环连接。 – usr 2012-04-20 09:59:28
这样做的问题是,子查询将在每个生成的行上运行,并且我有数十万行要加入。 – prince 2012-04-20 10:08:15
@prince添加方法2使用CROSS APPLY获取To date。 – 2012-04-20 10:41:30