Transactionというテーブルと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秒程度)になりますが、ファンドごとの最新の価格が使用されます。これは誤りです。
悪い部分は、価格表が私たちが使用する他のいくつかの表と比較して非常に小さいことであり、なぜそれがそれほど遅いのか私にはわかりません。問題のある行がSQLServerにデカルト積を処理させているのではないかと思いますが、それを回避する方法がわかりません。
私はこれを行うためのより効率的な方法を見つけることを望んでいますが、それは今のところ私を逃れています。何か案は?