2017-03-09 58 views
2

我有2列的表格:更新所有列的列在一個表中有遞增的整數

name | order 
------------ 
foo 0 
bar 0 
john 0 
doe 0 

我想創建一個SQL更新將由名字列順序這些,例如如:

name | order 
------------ 
foo 2 
bar 0 
john 3 
doe 1 

這是針對SQL Server的。

我已經看到,像這樣的東西適用於插入,但不適用於明顯更新。

insert into [dbo].[MyTable](Order) 
    select row_number() over (order by Name) 
    FROM [dbo].[MyTable] 

回答

5

使用row_number()

select 
    name 
    , row_number() over (order by name)-1 as [order] 
from t 

對於更新:使用common table expression (cte)

;with cte as (
    select 
     name 
    , [order] 
    , row_number() over (order by name)-1 as [NewOrder] 
    from t 
) 
update cte 
    set [order] = NewOrder; 

rextester演示:http://rextester.com/VSF47884

回報:

+------+-------+ 
| name | order | 
+------+-------+ 
| foo |  2 | 
| bar |  0 | 
| john |  3 | 
| doe |  1 | 
+------+-------+ 

你可以跳過公用表表達式和只使用一個子查詢,但我覺得它更容易使用CTE閱讀。

update s 
    set [order] = NewOrder 
from (
    select 
     name 
    , [order] 
    , row_number() over (order by name)-1 as [NewOrder] 
    from t 
) as s 
+1

最近令人印象深刻的排名。增值的方法 –

+0

@JohnCappelletti非常小覷:D – SqlZim

+0

說真的,你是23歲的戈登。但是,如果他失去了他的頭號排名,我就會擔心,這將意味着結束的日子。 :) –

相關問題