我无法看到这里出了什么问题:
DECLARE @cData TABLE(cID NVARCHAR(1), cSeed DECIMAL(8,8), cRank INT)
INSERT INTO @cData (cID, cSeed) SELECT 'W', RAND()
INSERT INTO @cData (cID, cSeed) SELECT 'X', RAND()
INSERT INTO @cData (cID, cSeed) SELECT 'Y', RAND()
INSERT INTO @cData (cID, cSeed) SELECT 'Z', RAND()
SELECT cID, cSeed, (RANK() OVER (ORDER BY cSeed)) AS cRank FROM @cData
UPDATE @cData
SET cRank = (SELECT (RANK() OVER (ORDER BY cSeed)))
SELECT * FROM @cData
为什么我从第一个select语句得到的结果与我从第二个语句得到的结果不同 - 为什么我的更新语句没有将相同的数据放入我的第一个select语句显示的表中?
答案 0 :(得分:1)
SELECT (RANK() OVER (ORDER BY cSeed))
这是一个单独的声明,由仅在OVER / ORDER BY
子句中使用的列相关联。
它只对一条记录(来自@cData的当前记录)的隐含行集进行操作,因此总是返回1,因为根据定义,集合中唯一记录的等级为1。
我相信你想要运行它:
WITH t AS
(
SELECT *,
RANK() OVER (ORDER BY cSeed) rnk
FROM @cData
)
UPDATE t
SET cRank = rnk