我有一个包含列display_order
的db表。数据如下所示:
2
4
7
10
12
我想更新相同的db列,它应该如下所示:
1
2
3
4
5
请建议一些简单的SQL代码。
答案 0 :(得分:4)
查看ROW_NUMBER(),这将对您有所帮助。
e.g。不会更新您的数据但会根据ROW_NUMBER显示当前订单和新订单的演示
SELECT display_order AS CurrentDisplayOrder,
ROW_NUMBER() OVER (ORDER BY display_order) AS NewDisplayOrder
FROM YourTable
ORDER BY display_order
如果这产生了您所期望的结果,那么您可以将其切换为UPDATE语句。
答案 1 :(得分:0)
扩展AdaTheDev的想法 - 使用CTE(公用表表达式)可以很容易地看到如何使用实际的UPDATE
来更新表。我在这里使用表变量@work
来模拟你现有的表 - 只需用你自己的表名替换我的表变量:
DECLARE @work TABLE (display_order INT)
INSERT INTO @work VALUES(2)
INSERT INTO @work VALUES(4)
INSERT INTO @work VALUES(7)
INSERT INTO @work VALUES(10)
INSERT INTO @work VALUES(12)
SELECT * FROM @work
;WITH UpdateTable AS
(
SELECT
display_order, new_order = ROW_NUMBER() OVER (ORDER BY display_order)
FROM @work
)
UPDATE @work
SET display_order = u.new_order
FROM @work w
INNER JOIN UpdateTable u ON w.display_order = u.display_order
SELECT * FROM @work
答案 2 :(得分:0)
没有CTE(但需要表中的一些关键字)
declare @tbl table(id int primary key identity(1,1),Value int)
insert @tbl values(2)
insert @tbl values(5)
insert @tbl values(3)
select * from @tbl
select *, ROW_NUMBER() over(order by Value) from @tbl order by id
update @tbl set Value = result from @tbl tbl
inner join (select id, ROW_NUMBER() over(order by Value) result from @tbl ) hlp on tbl.id =hlp.ids
select * from @tbl