根据ID应用订单的存储过程

时间:2018-03-30 10:24:03

标签: php sql sql-server stored-procedures

我有下面的表格,我想要一个存储过程来更新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开始下订单 我希望使用存储过程得到结果,请帮助。

2 个答案:

答案 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)