3

ギャップなしで再シーケンスする必要があるアイテムのリストがあります。それは次のように始まります:

ID   Sequence
123    1
125    2
155    3
158    4
165    6
170    9

最終的には(シーケンス6が5に変更され、シーケンス9が6に変更されることに注意してください)

ID   Sequence
123    1
125    2
155    3
158    4
165    5
170    6

この更新ステートメントを使用してみました

UPDATE  tblA
SET     tblA.Sequence = temp.Sequence
FROM    ( SELECT    id ,
                    ROW_NUMBER() OVER ( ORDER BY Sequence, ID ) AS Sequence
          FROM      dbo.tblA
        ) AS temp

しかし、私はただで終わる...

ID   Sequence
123    1
125    1
155    1
158    6
165    6
170    6

更新からselectステートメントを引き出すと、正しい結果が得られます。次のようなものに変更します

 UPDATE tblA
 SET    tblA.Sequence = temp.NewSequence
 FROM   ( SELECT    id ,
                    ROW_NUMBER() OVER ( PARTITION BY id ORDER BY Sequence, id ) 
                                                               AS NewSequence
          FROM      dbo.tblA
        ) AS temp

結果を生成します

ID   Sequence
123    1
125    1
155    1
158    1
165    1
170    1

私は何が間違っているのですか?

4

1 に答える 1

4

再番号付けされたセットを元のセットのIDに関連付ける必要があります。そうしないと、元のIDを一時セットの他のIDのシーケンス番号で更新します。

UPDATE a
SET a.Sequence = temp.Sequence
FROM    
    tblA a JOIN
    (
        SELECT id, ROW_NUMBER() OVER (ORDER BY Sequence, ID) AS Sequence
        FROM dbo.tblA
    ) AS temp ON temp.ID = a.ID
于 2012-05-04T18:06:51.460 に答える