请帮助解决我在单个查询中正确连接几个表时面临的问题。
简化架构如下:
TRANSACTION TABLE:
-----------------
TRANSACTION_DATE AMOUNT CURRENCY
---------------- ---------- --------
22/09/13 100 EUR
22/09/13 200 FRA
22/09/13 200 GBP
CURRENCY_CONVERSION TABLE:
-------------------------
FROM_CURRENCY TO_CURRENCY CONVERSION_DATE CONVERSION_RATE
------------- ----------- --------------- ---------------
GBP USD 23/09/13 1.61
EUR USD 22/09/13 1.35
目前,有效的查询如下(使用 Sybase/SQL Server 连接语法)
SELECT
t.transaction_date,
t.amount,
t.currency,
t.amount * cc.conversion_rate as amount_usd
FROM transaction t, currency_conversion cc,
WHERE t.transaction_date *= cc.conversion_date
AND t.currency *= cc.from_currency
AND cc.to_currency = 'USD'
当 currency_conversion 表在某些日期可能没有转换率时,我们在上述查询中遇到问题。在这种缺失值的情况下,企业希望求助于 DB 中可用的最新转换率。例如,如果今天没有欧元兑美元汇率,请使用昨天的汇率。我尝试按如下方式执行此操作:
SELECT
t.transaction_date,
t.amount,
t.currency,
t.amount * cc.conversion_rate as amount_usd
FROM transaction t, currency_conversion cc,
WHERE t.transaction_date *=
(SELECT max(c1.conversion_date) FROM currency_conversion c1
WHERE c1.from_currency = t.from_currency
AND c1.to_currency = 'USD')
AND t.currency *= cc.from_currency
AND cc.to_currency = 'USD'
此查询不起作用。t.transaction_date 上的左连接是非法的。如果我放弃加入,它会起作用,但我会在最终结果中错过一些交易。
请指教。
请注意:
- 在单个查询中实现这一点很重要(两个查询的两步解决方案无济于事)
- 使用的数据库是 Sybase 12 虽然我认为这是一个通用的 SQL 东西
- 这是一个简化的模式,在我使用的实际查询中,不同金额需要另外两次这样的美元转换
- 如果可能,请围绕现有查询提出一个解决方案,只需进行最少的更改
谢谢你的时间。