Oracle如何按Project_ID分组排序为Version列现有数据递增赋值
你原来的UPDATE语句确实无法实现需求,Oracle不支持UPDATE语句直接用GROUP BY做分组更新,也无法直接在赋值逻辑里生成分组排序后的连续序号,推荐用MERGE关联窗口函数的方案实现,写法如下:
MERGE INTO 你的表名 t USING ( SELECT ROWID AS row_id, -- 按Project_ID分组,CreatedDate升序生成从1开始的连续序号 ROW_NUMBER() OVER(PARTITION BY Project_ID ORDER BY CreatedDate ASC) AS new_ver FROM 你的表名 WHERE Version = 0 -- 仅处理原Version为0的历史数据 ) t2 ON (t.ROWID = t2.row_id) WHEN MATCHED THEN UPDATE SET t.Version = t2.new_ver;
说明
- 用Oracle内置的
ROW_NUMBER()窗口函数实现按Project_ID分组、CreatedDate升序生成从1开始的连续序号,逻辑清晰可控 - 用
ROWID作为关联条件不需要依赖表的主键,适配所有表结构场景 - 执行前可以先单独运行USING里的子查询,确认生成的序号符合预期后再执行完整更新操作
- 如果同项目下存在CreatedDate完全相同的行,需要相同时间的行版本号一致的话,可以把
ROW_NUMBER()替换为RANK()或者DENSE_RANK()
内容的提问来源于stack exchange,提问作者Marin
相关产品推荐
相关产品推荐

