Oracle SQL如何按8532重复序列批量更新表指定字段值
循环更新line_pattern字段实现方案
核心思路:先为表中所有行按指定排序规则生成连续行号,再通过行号对4取模的结果匹配8/5/3/2的循环序列,完成字段更新。
注意:必须明确指定排序规则(如按line_val大小、自增主键顺序等),否则行顺序无法保证,序列匹配会出错。
通用窗口函数实现(支持MySQL8.0+/PostgreSQL/SQL Server等主流数据库)
不同数据库的语法差异如下:
MySQL 8.0+
UPDATE 替换为实际表名 t1 JOIN ( SELECT 主键字段, ROW_NUMBER() OVER (ORDER BY 替换为排序字段 ASC) AS rn FROM 替换为实际表名 ) t2 ON t1.主键字段 = t2.主键字段 SET t1.line_pattern = CASE MOD(t2.rn, 4) WHEN 1 THEN 8 WHEN 2 THEN 5 WHEN 3 THEN 3 WHEN 0 THEN 2 END;
PostgreSQL
UPDATE 替换为实际表名 t1 SET line_pattern = CASE MOD(t2.rn, 4) WHEN 1 THEN 8 WHEN 2 THEN 5 WHEN 3 THEN 3 WHEN 0 THEN 2 END FROM ( SELECT 主键字段, ROW_NUMBER() OVER (ORDER BY 替换为排序字段 ASC) AS rn FROM 替换为实际表名 ) t2 WHERE t1.主键字段 = t2.主键字段;
SQL Server
WITH numbered_rows AS ( SELECT line_pattern, ROW_NUMBER() OVER (ORDER BY 替换为排序字段 ASC) AS rn FROM 替换为实际表名 ) UPDATE numbered_rows SET line_pattern = CASE rn % 4 WHEN 1 THEN 8 WHEN 2 THEN 5 WHEN 3 THEN 3 WHEN 0 THEN 2 END;
MySQL 5.x 兼容版本(不支持窗口函数场景)
SET @row_num = 0; UPDATE 替换为实际表名 SET line_pattern = CASE MOD(@row_num := @row_num + 1, 4) WHEN 1 THEN 8 WHEN 2 THEN 5 WHEN 3 THEN 3 WHEN 0 THEN 2 END ORDER BY 替换为排序字段 ASC;
内容的提问来源于stack exchange,提问作者RJD
相关产品推荐
相关产品推荐

