根据 ID 申请订单的存储过程

Posted

技术标签:

【中文标题】根据 ID 申请订单的存储过程【英文标题】:Stored Procedure for apply order as per ID 【发布时间】:2018-03-30 10:24:03 【问题描述】:

我有如下表,我想要一个存储过程来更新 Order as Per Id(主键)。目前我刚刚插入了订单列 在一个表中,所以我只想根据 id 订购数据库中的旧项目。

例如现在我有这样的桌子

表格名称:报告规则

id Order
-- ------
21  NULL
28  NULL
35  NULL
49  NULL

我想使用存储过程使其如下所示

id Order
-- ------
21  1   
28  2
35  3
49  4

所以我只想按照 ID 升序从 1 开始下一个订单 我想要使​​用存储过程的结果,请帮忙。

【问题讨论】:

提示:使用排名函数 【参考方案1】:

您可以使用可更新的 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 关键字。

【讨论】:

是的,我的错。我将用作 FieldOrder,但它不起作用【参考方案2】:

我认为您可以使用带有ROW_NUMBERUPDATE ... 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)

【讨论】:

@Badal Solanki - 你使用 MSSQLServer 还是 MySQL?我检查了两个查询,它适用于 MSSQLServer。 @Badal Solanki - 然后您需要将标签更改为 MySQL。 @Badal Solanki - 我已经更新了我的答案。尝试使用最后一个查询。

以上是关于根据 ID 申请订单的存储过程的主要内容,如果未能解决你的问题,请参考以下文章

按天分区并通过存储过程删除历史分区

订单流水号(唯一编号)的生成

MyBatis高级查询 存储过程

如何根据用户权限屏蔽或显示SAP的订单中的成本显示

SQL 存储过程 :根据ID获取不包含自身和子项的项目

mysql 生成流水号 存储过程 订单编号