如何在UPDATE子句中使用ROW_NUMBER()函数?

36

ROW_NUMBER() 只能在 MS SQL ServerSELECT 子句中使用,但我想像下面这样在更新中使用它:

Update MyTab Set MyNo = 123 +  ROW_NUMBER() over (Order By ID)
Where a=b;

然后我遇到了如下错误:

窗口函数只能出现在SELECT或ORDER BY子句中。

如何在UPDATE子句中使用ROW_NUMBER()


2
https://dev59.com/BGXWa4cB1Zd3GeqPKTC3 - dugas
7
好的,我会尽力进行翻译,请问需要翻译的内容是什么? - Vadzim
3个回答

54

您可以使用公共表表达式(CTE):

;WITH RowNbrs AS (
    SELECT  ID
            , ROW_NUMBER() OVER (ORDER BY ID) AS RowNbr
    FROM    MyTab
    WHERE   a = b
)
UPDATE  t 
SET     t.MyNo = 123 +  r.RowNbr
FROM    MyTab t
        JOIN RowNbrs r ON t.ID = r.ID;

33
DECLARE @MyTable TABLE
(
    ID INT IDENTITY(2,2) PRIMARY KEY,
    MyNum INT,
    ColA INT,
    ColB INT
);

INSERT  @MyTable (ColA, ColB)
SELECT 11, 11 UNION ALL
SELECT 22, 22 UNION ALL
SELECT NULL, NULL UNION ALL
SELECT 33, NULL UNION ALL
SELECT NULL, 44 UNION ALL
SELECT 55, 66;

UPDATE  UpdateTarget
SET     MyNum = RowNum
FROM
(
    SELECT  x.MyNum, ROW_NUMBER() OVER(ORDER BY x.ID) AS RowNum
    FROM    @MyTable x
    WHERE   x.ColA = x.ColB
) AS UpdateTarget;

SELECT * FROM @MyTable;

结果:

ID          MyNum       ColA        ColB
----------- ----------- ----------- -----------
2           1           11          11
4           2           22          22
6           NULL        NULL        NULL
8           NULL        33          NULL
10          NULL        NULL        44
12          NULL        55          66

9
我会使用公用表表达式(CTE)。
WITH myUpdate ( myRowNumber )
AS
( 
    SELECT ROW_NUMBER() over (order by ID) As myRowNumber
    FROM MyTab
    WHERE a = b
 ) 

update MyTab 
set MyNo = 123 + myRowNumber
FROM myUpdate

你可以先测试一下,通过执行一个
select * from myUpdate

在我的情况下,需要使用Join来完成我的查询。 - Arun Prasad E S
WITH myUpdate (id, myRowNumber ) AS ( SELECT id, ROW_NUMBER() over (order by ID) As myRowNumber FROM AspNetUsers WHERE UserType='Customer' )在myUpdate中更新AspNetUsers,设置EmployeeCode的值为FORMAT(myRowNumber,'00000#') FROM myUpdate left join AspNetUsers u on u.Id=myUpdate.id - Arun Prasad E S
救了我的一天!谢谢。 - Shahram Banazadeh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接