假设我有一个名为 Transaction 的表和另一个名为 Price 的表。Price 持有给定基金在不同日期的价格。每个基金都会在不同的日期添加价格,但它们不会在所有可能的日期都有价格。因此,对于 XYZ 基金,我可能有 5 月 1 日、5 月 7 日和 5 月 13 日的价格,而基金 ABC 可能有 5 月 3 日、5 月 9 日和 5 月 11 日的价格。
所以现在我正在查看基金在交易日的现行价格。该交易于 5 月 10 日针对基金 XYZ。我要的是当天最新的已知价格,也就是5月7日的价格。
这是代码:
select d.TransactionID, d.FundCode, d.TransactionDate, v.OfferPrice
from Transaction d
inner join Price v
on v.FundCode = d.FundCode
and v.PriceDate = (
select max(PriceDate)
from Price
where FundCode = v.FundCode
/* */ and PriceDate < d.TransactionDate
)
它可以工作,但速度很慢(在现实世界中使用几分钟)。如果我删除带有前导注释的行,查询会非常快(2 秒左右),但它会使用每只基金的最新价格,这是错误的。
不好的部分是价格表与我们使用的其他一些表相比是微不足道的,我不清楚为什么它这么慢。我怀疑有问题的行迫使 SQL Server 处理笛卡尔积,但我不知道如何避免它。
我一直希望找到一种更有效的方法来做到这一点,但到目前为止我还没有想到。有任何想法吗?