根据 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_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)
【讨论】:
@Badal Solanki - 你使用 MSSQLServer 还是 MySQL?我检查了两个查询,它适用于 MSSQLServer。 @Badal Solanki - 然后您需要将标签更改为 MySQL。 @Badal Solanki - 我已经更新了我的答案。尝试使用最后一个查询。以上是关于根据 ID 申请订单的存储过程的主要内容,如果未能解决你的问题,请参考以下文章