【问题标题】:How to use ROW_NUMBER() in UPDATE clause? [duplicate]如何在 UPDATE 子句中使用 ROW_NUMBER()? [复制]
【发布时间】:2013-10-08 02:43:04
【问题描述】:

ROW_NUMBER() 仅用于MS SQL Server 中的SELECT 子句,但我想将其用于更新,如下所示:

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

然后我得到了类似的错误,

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

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

【问题讨论】:

标签: sql-server tsql sql-server-2008-r2 window-functions


【解决方案1】:

您可以使用 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;

【讨论】:

    【解决方案2】:
    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
    

    【讨论】:

      【解决方案3】:

      我会使用 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
      

      【讨论】:

      • 在我的情况下需要加入才能完成我的查询
      • WITH myUpdate (id, myRowNumber) AS (SELECT id, ROW_NUMBER() over (order by ID) As myRowNumber FROM AspNetUsers WHERE UserType='Customer') 更新 AspNetUsers set EmployeeCode = FORMAT(myRowNumber,' 00000#') FROM myUpdate left join AspNetUsers u on u.Id=myUpdate.id
      • 拯救了我的一天!谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-07
      • 2019-05-12
      • 1970-01-01
      • 2012-10-13
      • 1970-01-01
      • 2017-12-20
      相关资源
      最近更新 更多