我有下面的表格,我想要一个存储过程来更新Order as Per Id(Primery键)。目前我只是插入了Order列 在一个表中,所以我只想按照id在数据库中订购旧项目。
例如现在我有这样的表
表名:ReportRule
id Order
-- ------
21 NULL
28 NULL
35 NULL
49 NULL
我想在下面使用存储过程
id Order
-- ------
21 1
28 2
35 3
49 4
所以我只想根据ID升序从1开始下订单 我希望使用存储过程得到结果,请帮助。
答案 0 :(得分:2)
您可以使用可更新的CTE:
with toudpate as (
select rr.*, row_number() over (order by id) as new_order
from ReportRule rr
)
update toupdate
set [order] = new_order;
顺便说一句,order
是一个非常糟糕的列名,因为它是一个SQL关键字。
答案 1 :(得分:1)
我认为您可以使用带有ROW_NUMBER
然后UPDATE ... FROM ...
UPDATE dst
SET
dst.[Order]=src.[Order]
FROM ReportRule dst
JOIN
(
SELECT ID,ROW_NUMBER()OVER(ORDER BY ID) [Order]
FROM ReportRule
) src
ON dst.ID=src.ID
没有ROW_NUMBER
的变体(如果您有旧版本的SQL Server,可以使用它)
UPDATE dst
SET
dst.[Order]=(SELECT COUNT(*) FROM ReportRule src WHERE dst.ID>=src.ID)
FROM ReportRule dst
尝试使用MySQL的下一个变种
UPDATE ReportRule dst
SET
dst.FieldOrder=(SELECT COUNT(*) FROM ReportRule src WHERE dst.ID>=src.ID)