我在這裏需要更新一些記錄表結構T-SQL更新數據查詢
表A是我們需要更新一些記錄 A(身份證,DataYear0,DataYear1,DataYear3)
主要原因之一表B具有比我們需要 B(標識,年份,DataYear)
實施例的數據表B數據的某些其它: B(ABC,1950,1.25) B(ABC,1951,1.29) 。 。 .. B(abc, 2008,1.67) B(ABC,2009,1.23) B(ABC,2010,1.52) B(ABC,2011,1.78) B(ABC,2012,NULL)
隨着2012作爲當前年份,我需要更新表A中前三年(即2011,2010,2009)的數據值。表A
因此,表A需要更新爲A(abc,1.78,1.52,1.23)上面的例子。同樣的其他記錄需要更新。
Id是兩個表上的主鍵。
查詢我至今是
UPDATE A SET
DataYear0 = CASE WHEN Year+1 = YEAR(GETDATE()) THEN DataYear END,
DataYear1 = CASE WHEN Year+2 = YEAR(GETDATE()) THEN DataYear END,
DataYear2 = CASE WHEN Year+3 = YEAR(GETDATE()) THEN DataYear END
FROM A
LEFT JOIN B
ON A.Id=B.Id
這沒有工作,因爲我覺得這是從我們即要在年內開退回多餘年的記錄,只是在過去三年
UPDATE A SET
DataYear0 = CASE WHEN Year+1 = YEAR(GETDATE()) THEN DataYear END,
DataYear1 = CASE WHEN Year+2 = YEAR(GETDATE()) THEN DataYear END,
DataYear2 = CASE WHEN Year+3 = YEAR(GETDATE()) THEN DataYear END
FROM A
LEFT JOIN B
ON A.Id=B.Id
GROUP BY Id,Year,DataYear
HAVING ((YEAR(GETDATE())-3) <= Year) AND (Year <> YEAR(GETDATE()))
但仍然沒有更新數據。
使用CTE
;WITH cte AS
(
SELECT
A.Id
,B.Year
,B.DataYear
,ROW_NUMBER() OVER (PARTITION BY Id ORDER BY Year DESC) as row
FROM A
LEFT JOIN B
ON A.Id=B.Id
GROUP BY Id,Year,DataYear
HAVING ((YEAR(GETDATE())-3) <= Year) AND (Year <> YEAR(GETDATE()))
)
UPDATE
A.DataYear0 = CASE WHEN row=1 THEN DataYear END
,A.DataYear1 = CASE WHEN row=2 THEN DataYear END
,A.DataYear2 = CASE WHEN row=3 THEN DataYear END
FROM A
LEFT JOIN cte
ON A.Id = cte.Id
的數據仍然沒有更新嘗試。我將不勝感激任何人的建議。提前謝謝了。
ID沒有在表B中的主鍵(這不是唯一的)。 – GilM 2012-07-20 22:54:44
是的,你是對的。對不起,我應該澄清一點。 – JustCurious 2012-07-21 06:48:11