[英]Update Based on Self-Join
我正在嘗試做一個簡單的計算並根據匹配的 ID 和 AsOfDates 更新一個字段。 這是我的腳本。
UPDATE A
SET A.Vol30Days =
(SELECT STDEV(PX_BID) OVER (ORDER BY ID, AsOfDate ROWS BETWEEN 30 PRECEDING AND CURRENT ROW)
FROM Prices)
FROM Prices A
INNER JOIN Prices B
ON A.ID = B.ID
AND A.AsOfDate = B.AsOfDate
子查詢工作正常,邏輯看起來正常,但 SQL Server 拋出錯誤,說 UPDATE 和 DELETE 語句中的 FROM 子句不能包含子查詢源或連接。
嘗試使用子查詢。 我認為這是等效的邏輯:
UPDATE Prices
SET Vol30Days = (SELECT STDEV(PX_BID)
FROM (SELECT TOP (31) p2.*
FROM Prices p2
WHERE p2.ID <= prices.ID
) p2
);
嘗試使用可更新的 CTE:
WITH cte AS (
SELECT Vol30Days AS VolOrig,
STDEV(PX_BID) OVER (ORDER BY ID, AsOfDate ROWS BETWEEN 30 PRECEDING AND CURRENT ROW) AS VolNew
FROM Prices
)
UPDATE cte
SET VolOrig = VolNew;
但鑒於新數據只是來自同一個表的派生數量,您可能希望避免更新,因為只要表的數據發生變化,就可能需要重新進行更新。 相反,請考慮創建一個視圖。
使用中間存儲,如表變量。
DECLARE @BIDS TABLE (ID integer, BIDS numeric(18,2))
INSERT INTO @BIDS (ID, BIDS)
SELECT A.ID, (SELECT STDEV(PX_BID) OVER (ORDER BY ID, AsOfDate ROWS BETWEEN 30 PRECEDING AND CURRENT ROW) FROM Prices)
FROM Prices A
INNER JOIN Prices B ON A.ID = B.ID AND A.AsOfDate = B.AsOfDate
UPDATE A SET Vol30Days = B.BIDS
FROM Prices A
INNER JOIN @BIDS B ON B.ID = A.ID
或者,您可以使用時態表:
SELECT A.ID, (SELECT STDEV(PX_BID) OVER (ORDER BY ID, AsOfDate ROWS BETWEEN 30 PRECEDING AND CURRENT ROW) FROM Prices) AS BIDS
INTO #BIDS
FROM Prices A
INNER JOIN Prices B ON A.ID = B.ID AND A.AsOfDate = B.AsOfDate
UPDATE A SET Vol30Days = B.BIDS
FROM Prices A
INNER JOIN #BIDS B ON B.ID = A.ID
DROP TABLE #BIDS
UPDATE A
SET A.Vol30Days = B.Vol30Days
FROM Prices A
INNER JOIN (
select t1.ID,
t1.AsOfDate,
STDEV(PX_BID) OVER (ORDER BY ID, AsOfDate ROWS BETWEEN 30 PRECEDING AND CURRENT ROW) as Vol30Days
from Prices t1
) B
ON A.ID = B.ID
AND A.AsOfDate = B.AsOfDate
以下是有關推薦方法的文檔:
請注意,帶有 JOIN 的 FROM 子句(您的原始策略)目前處於私人預覽版中,很快將轉為公共預覽版。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.