我有一个有2列的表:
name | order
------------
foo 0
bar 0
john 0
doe 0
Run Code Online (Sandbox Code Playgroud)
我想创建一个SQL更新,它将通过名称列对它们进行排序,例如:
name | order
------------
foo 2
bar 0
john 3
doe 1
Run Code Online (Sandbox Code Playgroud)
这适用于SQL Server.
我已经看到像这样的东西可用于插入,但显然不适用于更新.
insert into [dbo].[MyTable](Order)
select row_number() over (order by Name)
FROM [dbo].[MyTable]
Run Code Online (Sandbox Code Playgroud)
使用row_number():
select
name
, row_number() over (order by name)-1 as [order]
from t
Run Code Online (Sandbox Code Playgroud)
更新:使用公用表表达式(cte)
;with cte as (
select
name
, [order]
, row_number() over (order by name)-1 as [NewOrder]
from t
)
update cte
set [order] = NewOrder;
Run Code Online (Sandbox Code Playgroud)
rextester演示:http://rextester.com/VSF47884
收益:
+------+-------+
| name | order |
+------+-------+
| foo | 2 |
| bar | 0 |
| john | 3 |
| doe | 1 |
+------+-------+
Run Code Online (Sandbox Code Playgroud)
您可以跳过公用表表达式并只使用子查询,但我认为使用cte更容易阅读.
update s
set [order] = NewOrder
from (
select
name
, [order]
, row_number() over (order by name)-1 as [NewOrder]
from t
) as s
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38 次 |
| 最近记录: |