有兩種方法可以考慮 - 我會測試兩種方法,看看哪種方法對您的情況更好。
- 在子查詢中使用
ROW_NUMBER()
查找所有價格變化的最新價格變化,然後將其加入價格以得到正確的價格。
- 使用相關子查詢(很多這樣的方式,無論是在
SELECT
在其他的答案或與OUTER APPLY
)僅獲取價格
如果你的價格表是非常大的,你的每一行最近的價格變化同時獲得大量價格,方法#1可能會更好,因此相關子查詢不會爲結果集的每一行運行。
如果您的最終查詢拉回相對較少的記錄而不是您的服務器的巨大結果集,則相關的子查詢可能會更好。
1. ROW_NUMBER()方法
SELECT
P.ID,
COALESCE(PC.NewCostPrice, P.Cost) AS LatestPrice
FROM Price AS P
LEFT OUTER JOIN (
SELECT
ID,
ROW_NUMBER() OVER (PARTITION BY ID
ORDER BY [Date] DESC) AS RowId,
NewCostPrice
FROM PriceChange
) PC
ON P.ID = PC.ID
AND PC.RowId = 1 -- Only most recent
2a上。相關子查詢(SELECT
)
SELECT
P.ID,
COALESCE((
SELECT TOP 1
NewCostPrice
FROM PriceChange PC
WHERE PC.ID = P.ID
ORDER BY PC.[Date] DESC
), P.Cost) AS LatestPrice
FROM Price AS P
2b中。與OUTER APPLY
SELECT
P.ID,
COALESCE(PC.NewCostPrice, P.Cost) AS LatestPrice
FROM Price AS P
OUTER APPLY (
SELECT TOP 1
NewCostPrice
FROM PriceChange PC
WHERE PC.ID = P.ID
ORDER BY PC.[Date] DESC
) PC
相關子查詢是否使用2a或2b更可能發生在你想如何保持查詢前進的偏好。
是'ID'主鍵? – ydoow