求PLSQL语句:按PO_HEADER分组更新LINE_NUM序号
按PO_HEADER分组生成递增LINE_NUM的实现方案
没问题!我帮你整理了几种主流数据库下的实现方案,直接就能套用,完全满足你按PO_HEADER分组生成从1开始的递增序号需求:
MySQL 8.0+ 版本
MySQL 8.0及以上支持窗口函数,用ROW_NUMBER()来实现最简洁直观。你可以用下面的更新语句:
UPDATE your_table t JOIN ( SELECT PO_HEADER, ITEM, ROW_NUMBER() OVER (PARTITION BY PO_HEADER ORDER BY ITEM) AS new_line_num FROM your_table ) AS sub ON t.PO_HEADER = sub.PO_HEADER AND t.ITEM = sub.ITEM SET t.LINE_NUM = sub.new_line_num;
说明:这里ORDER BY ITEM是指定每组内的排序依据,如果你有更合适的排序字段(比如记录的创建时间),直接替换成对应的字段即可。
PostgreSQL
PostgreSQL可以借助CTE(公共表表达式)结合窗口函数来完成更新:
WITH ranked_data AS ( SELECT PO_HEADER, ITEM, ROW_NUMBER() OVER (PARTITION BY PO_HEADER ORDER BY ITEM) AS new_line_num FROM your_table ) UPDATE your_table t SET LINE_NUM = rd.new_line_num FROM ranked_data rd WHERE t.PO_HEADER = rd.PO_HEADER AND t.ITEM = rd.ITEM;
同样,ORDER BY ITEM可以根据你的实际排序需求调整。
SQL Server
SQL Server的语法更灵活,直接在CTE里处理排序后就能更新:
WITH ranked_data AS ( SELECT LINE_NUM, ROW_NUMBER() OVER (PARTITION BY PO_HEADER ORDER BY ITEM) AS new_line_num FROM your_table ) UPDATE ranked_data SET LINE_NUM = new_line_num;
针对旧版本MySQL(低于8.0)的兼容方案
如果你的MySQL版本不支持窗口函数,用变量也能实现:
SET @prev_po = NULL; SET @line_num = 0; UPDATE your_table SET LINE_NUM = CASE WHEN PO_HEADER = @prev_po THEN @line_num := @line_num + 1 ELSE @line_num := 1 AND @prev_po := PO_HEADER END ORDER BY PO_HEADER, ITEM;
重要提示
- 记得把语句里的
your_table替换成你实际使用的表名 - 确保
ORDER BY后的字段能正确控制每组内的序号顺序,避免生成的序号不符合预期
内容的提问来源于stack exchange,提问作者Pasha Md
相关产品推荐
相关产品推荐

