2011-08-05 17 views
5

SQL Server 2005のTSQL - UPDATE文で自動インクリメント

私は次を含むテーブルを持っている: - :私は

[order_id]  [index_1] 
600020001  1 
600020002  1 
600020002  2 
600020002  3 
600020003  1 

- に更新する必要がある

[order_id]  [index_1] 
600020001  0 
600020002  0 
600020002  0 
600020002  0 
600020003  0 
... 

上の例のように、index_1フィールドに値を設定するUPDATE文を記述しようとしています。私はCURSORを使ってこれを達成することができますが、理想的には可能な限りそれをやりたいと思います。

新しいorder_idごとに、番号付けが再開されます。各order_id行ごとに、index_1フィールドが1だけインクリメントされます。

カーソルなしでこれを行うことはできますか?

答えて

13

CTErow_number()を使用して任意の操作を行うことができます。以下のコードの表@Tはデモンストレーション用です。 @Tをテーブルが呼び出されたものに置き換えます。

declare @T table ([order_id] int, [index_1] int) 

insert into @T values 
(600020001,  0), 
(600020002,  0), 
(600020002,  0), 
(600020002,  0), 
(600020003,  0) 

;with cte as 
(
    select index_1, 
     row_number() over(partition by order_id order by (select 1)) as rn 
    from @T  
) 
update cte 
    set index_1 = rn 

select * 
from @T 

結果:

order_id index_1 
----------- ----------- 
600020001 1 
600020002 1 
600020002 2 
600020002 3 
600020003 1 
+1

+1(でパーティション...) ''上ROW_NUMBER()を使用します。ここに手袋のようにフィットします。 –

+0

ありがとうございます。私がしたいことを正確に達成します。 –