2011-08-05 31 views
5

SQL Server 2005的TSQL - 自动递增在UPDATE语句

我有一个包含以下内容的表: -

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

需要被更新为: -

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

我我试图编写一个UPDATE语句来填充index_1字段,如上例所示。我可以使用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

谢谢。达到我想要的目标。 –