1

我有一张桌子。

ID       SID     CID      Number
----------------------------------
1237      1       5        NULL
1236      1       5        NULL
1235      1       NULL      2
1234      1       NULL      2
1233      1       NULL      1
1232      1       NULL      1

我想获得最大数值。并更新为 NULL 的 Number 列

DECLARE @Number INT;
SELECT @Number =  max([Number]) FROM STACKOVERFLOW WHERE [Number] IS NOT NULL AND SID = 1
SELECT @Number 

此 SQL 语句将返回 2。

正如我所说,我想更新数字列,null但它应该是"maximum value of number column"+ 1,也就是说在我的情况下它应该是 3。

DECLARE SID INT = 1;

UPDATE STACKOVERFLOW 
SET
Number = (
          SELECT TOP 1 CASE 
          WHEN Number IS NULL THEN 1 ELSE @Number + 1 END 
          FROM STACKOVERFLOW 
          WHERE SID = @SID AND Number IS NULL
         )
FROM STACKOVERFLOW WHERE ID = 1237 

该表将如下所示:

ID       SID     CID      Number
----------------------------------
1237      1       5         3
1236      1       5        NULL
1235      1       NULL      2
1234      1       NULL      2
1233      1       NULL      1
1232      1       NULL      1

之后,当再次使用 sql 语句ID = 1236 时,@Number 将返回 3,记录将如下所示。

ID       SID     CID      Number
----------------------------------
.
1236      1       5        4
.
.

但我想要的结果是

ID       SID     CID      Number
----------------------------------
.
1236      1       5      3
.

在操作结束时,表格应该像

ID       SID     CID      Number
----------------------------------
1237      1       5         3
1236      1       5         3
1235      1       NULL      2
1234      1       NULL      2
1233      1       NULL      1
1232      1       NULL      1
1231      2       5         5
1230      2       5         5
1229      2       NULL      4
1228      2       NULL      4

任何想法?感谢您的回复。

4

2 回答 2

4
UPDATE STACKOVERFLOW
   SET Number = (SELECT MAX(number) + 1 FROM STACKOVERFLOW WHERE SID = 1)
 WHERE Number IS NULL
   AND SID = 1

然后对 SID = 2 做同样的事情

UPDATE STACKOVERFLOW
   SET Number = (SELECT MAX(number) + 1 FROM STACKOVERFLOW WHERE SID = 2)
 WHERE Number IS NULL
   AND SID = 2

或者让它更优雅一点:

UPDATE STACKOVERFLOW
   SET Number = (SELECT MAX(number) + 1 FROM STACKOVERFLOW WHERE SID = A.SID)
  FROM STACKOVERFLOW A
 WHERE Number IS NULL
于 2012-09-09T12:20:23.013 回答
0

一次全部设置或检查 CID 是否为 NULL

于 2012-09-09T12:22:45.323 回答