2017-08-10 7 views
-2

T-SQLを使用して、特定のテーブル列の数値の自動インクリメントシーケンスを修正する方法はありますか?SQLを使用して数値シーケンスを修正する

私はこのようになりますテーブルを考えてみましょう:

Id Bar Foo 
    2  5 1 
    3  6 1 
21  7 1 
22 16 1 
154 17 1 
176 18 1 

私はこのケースでは(それが特定のIdで行から始まるBar列の順序を継続する方法でFoo = 1で行を更新したいと思いますId = 21で行を選択することができます)と、最終的な結果は次のようになり

Id列の順序に基づいて、次のすべての行にそれを適用します。

Id Bar Foo 
    2  5 1 
    3  6 1 
21  7 1 
22  8 1 
154  9 1 
176 10 1 

詳細:

テーブルには、特定の場所(場所IDは「Foo」の例)のファイルデータが格納されています。各行は1つのファイルで、ファイル番号(ファイル番号は例の「Bar」)です。

ファイル番号は、その場所の現在の最大ファイル番号に基づいてファイルを作成する際に発生します。いくつかのエラーのために、ファイル番号は、ファイル番号の順序にギャップを残していくつかの先をスキップし、私はT Sqlを使用してそのギャップを修正したいと思います。 Idを想定し

+2

「自動インクリメント」と言えば、ちょうど**あなたは何について話していますか?アイデンティティ列? –

+1

* 'Id = 14'で行を選択できます* ...提供されるデータにこのような行はありません –

+3

データに関係のないダム値を増やすだけの場合(16から8をリセットできれば17 9への影響はありません)、なぜデータを照会するときにこのシーケンスを生成しないのですか? ROW_NUMBER()は、列を維持しなくてもそれを実行できます。この意味のないデータを保存する際の問題は、行が変更されるたびにリセットする必要があることです。 –

答えて

2

あなたはUPDATEに次のクエリを使用することができます行の順序を決めるフィールドです:

;WITH ToUpdate AS (
    SELECT Id, Bar, 
      FIRST_VALUE(Bar) OVER (ORDER BY Id) + 
      ROW_NUMBER() OVER (ORDER BY Id) - 1 AS newBar 
    FROM mytable 
    WHERE Foo = 1 AND Id >= 21 
) 
UPDATE ToUPDATE 
SET Bar = newBar 

Demo here

すでにコメントで述べたように、クエリからBar値を取得することができますCTEで使用されているものと同様です。したがって、テーブルの列にそのような値を保持する必要はありません。

+0

それだけです! CTEに関する情報もありがとう –

関連する問題