表A重复记录更新需求:按指定分组分配product_cost_id值
调整方案
思路说明
要实现指定重复组分配固定ID、其余记录分配递增ID的需求,建议分两步处理:先给特定重复组批量设置固定值,再给剩余未赋值的记录分配递增ID,避免固定值占用序列生成的ID。
第一步:给指定重复组设置固定ID
执行UPDATE语句,直接匹配目标CostName的记录,设置对应的固定product_cost_id:
UPDATE tableA SET product_cost_id = CASE WHEN CostName = 'IPG-50849 Subscription OPEX RC' THEN 1 WHEN CostName = 'IPG-50849 Voice New OPEX NRC' THEN 2 END WHERE session_id = 9170765632313984400 AND product_cost_id IS NULL AND CostName IN ('IPG-50849 Subscription OPEX RC', 'IPG-50849 Voice New OPEX NRC');
第二步:给剩余未赋值记录分配递增ID
使用MERGE语句给剩下的product_cost_id为空的记录调用pkgutils.getid()生成递增ID:
MERGE INTO tableA src USING ( SELECT p.rowid, p.session_id FROM tableA p WHERE p.session_id = 9170765632313984400 AND p.product_cost_id IS NULL ) tgt ON (src.rowid = tgt.rowid) WHEN MATCHED THEN UPDATE SET src.product_cost_id = pkgutils.getid();
替代方案:单MERGE语句实现
如果希望用单条MERGE完成,可以在SET子句中通过CASE判断CostName,同时确保固定ID的记录不调用序列函数:
MERGE INTO tableA src USING ( SELECT p.*, COUNT(*) OVER(PARTITION BY CostName) AS cnt FROM tableA p WHERE p.session_id = 9170765632313984400 ) tgt ON (src.session_id = tgt.session_id AND src.CostName = tgt.CostName) WHEN MATCHED THEN UPDATE SET src.product_cost_id = CASE WHEN tgt.CostName = 'IPG-50849 Subscription OPEX RC' THEN 1 WHEN tgt.CostName = 'IPG-50849 Voice New OPEX NRC' THEN 2 ELSE pkgutils.getid() END WHERE src.product_cost_id IS NULL;
注意:如果
pkgutils.getid()基于数据库序列实现,单MERGE方案中固定值分支不会消耗序列,但需确保序列当前值为3,否则生成的ID可能不是从3开始。若序列当前值不符合预期,分步方案更稳妥。
内容的提问来源于stack exchange,提问作者B RAVI
相关产品推荐
相关产品推荐

