MS SQL Server - 使用行 ID 将行值更新到下一行

Ted*_*YEN 2 locking

我有一张如下表:

Newid1       a   b   c
   1       null  40  50
   2       null  45  55
   3       null  46  56
   4       null  47  57
   5       null  48  58
Run Code Online (Sandbox Code Playgroud)

现在我想通过将 C 列值更新到其中来更新列中的值(例如:50 到第二行,55 到第三行,56 到第四行......)。如何使用 WHILE 命令执行此操作。提前谢谢大家。

gbn*_*gbn 6

它可以在一个基于集合的操作中完成,当您一遍又一遍地更新行时,
使用 WHILE 可能会引发“万圣节问题”。

使用 LAG 的 SQL Server 2012 更容易

DECLARE @t TABLE
(
    Newid1 int
    , a int  NULL
    , b int
    , c int
);

INSERT INTO @t VALUES(1, NULL, 40, 50)
        ,(2, NULL, 45, 55) ,(3, NULL, 46, 56)
        ,(4, NULL, 47, 57) ,(5, NULL, 48, 58);

-- SQL Server 2012
WITH t AS
(
    SELECT a, LAG(c) OVER (ORDER BY Newid1) AS nextC
    FROM @t
)
UPDATE t SET a = nextC;

SELECT * FROm @t;
Run Code Online (Sandbox Code Playgroud)

但是对于 SQL Server 2005+

DECLARE @t TABLE
(
    Newid1 int
    , a int  NULL
    , b int
    , c int
);

-- SQL Server 2005+
WITH t AS
(
    SELECT Newid1, ROW_NUMBER() OVER (ORDER BY Newid1) +1 AS nextID, a, c
    FROM @t
)
UPDATE t1
SET a = t2.c
FROM
   t AS t1
   JOIN
   t AS t2 ON t1.Newid1 = t2.nextID;

SELECT * FROM @t;
Run Code Online (Sandbox Code Playgroud)