1

テーブルが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である更新番号列

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 に答える