[MSSQL] CTE 的應用(4) - 使用 CTE 將視窗型函數的值做 UPDATE

[SQL] CTE 的應用(4) – 使用 CTE 將視窗型函數的值做 UPDATE

事情是這個樣子的,原本天真地以為用視窗函數計算出來後,直接就可以做 UPDATE ,沒想到出錯了。

image

 

 


-- Author: Henry
-- Author URL: http://www.dotblogs.com.tw/henryli/
-- Script Version: 1.0
-- MSSQL Version: 2005+
-- Create date: 2014-06-14
-- Update date: 2014-06-14
-- Description:	使用 CTE 先將視窗函數的值算好,在 JOIN 自身後做 UPDATE (本例為幫分數做排名)
-- Require: none
-- =============================================
--建立測試資料
CREATE TABLE T (Score int, RankNo int)
INSERT INTO T VALUES (80, NULL),(60, NULL),(75, NULL)

--查詢
SELECT Score, ROW_NUMBER() OVER(ORDER BY Score DESC) AS RankOrder FROM T

--使用 CTE 先將視窗函數的值算好,在 JOIN 自身後做 UPDATE
;WITH CTE AS (
	SELECT Score, ROW_NUMBER() OVER(ORDER BY Score DESC) AS RankOrder 
	FROM T
)
UPDATE T SET RankNo = RankOrder
FROM T
INNER JOIN CTE ON T.Score = CTE.Score

--查詢結果
SELECT * FROM T ORDER BY Score DESC;

 

image

成功。

 

創用 CC 授權條款
本著作係採用創用 CC 姓名標示-相同方式分享 4.0 國際 授權條款授權,文章歡迎轉載,請註明出處,謝謝~~~