Oracle多列值合并:如何更新DAILY_DATA表指定BOOK_ID行的TRANSFER_COST字段
在Oracle中实现指定行TRANSFER_COST值的累加更新
嘿,这个需求其实很好实现,咱们可以用Oracle的UPDATE语句或者MERGE语句来搞定,完全贴合你要的结果——把BOOK_ID=200行的TRANSFER_COST累加到同组的BOOK_ID=100行里,同时保留原200行的数据。
方法一:使用UPDATE关联子查询(最直观)
这种方法直接针对目标行(BOOK_ID=100)进行更新,通过子查询找到对应组的BOOK_ID=200行的成本值,然后累加:
UPDATE DAILY_DATA t1 SET TRANSFER_COST = t1.TRANSFER_COST + ( SELECT TRANSFER_COST FROM DAILY_DATA t2 -- 关联条件:确保是同一部门、类别、日期下的行 WHERE t2.DEPT = t1.DEPT AND t2.CLASS = t1.CLASS AND t2."DATE" = t1."DATE" -- 注意DATE是Oracle关键字,需用双引号包裹 AND t2.BOOK_ID = 200 ) WHERE t1.BOOK_ID = 100; -- 执行完别忘提交事务 COMMIT;
关键说明:
- DATE字段的处理:因为
DATE是Oracle的保留关键字,如果你的表字段确实叫DATE,记得用双引号"DATE"包裹,避免语法错误;如果是字符串类型的日期,建议用TO_DATE(t2."DATE", 'DD-MON')转换为日期类型,避免因NLS格式问题导致关联失败。 - 多匹配场景处理:如果同一DEPT/CLASS/DATE下存在多个BOOK_ID=200的行,子查询会返回多行导致报错,这时候把子查询改成
SELECT SUM(TRANSFER_COST) FROM ...就能自动累加所有匹配行的成本值。
方法二:使用MERGE语句(更灵活)
如果后续需要扩展逻辑(比如同时更新多行或者处理不存在的行),MERGE语句会更灵活,核心逻辑和UPDATE一致:
MERGE INTO DAILY_DATA t1 USING ( -- 先筛选出所有需要被累加的BOOK_ID=200的行 SELECT DEPT, CLASS, "DATE", TRANSFER_COST FROM DAILY_DATA WHERE BOOK_ID = 200 ) t2 -- 匹配条件:同一组的BOOK_ID=100行 ON (t1.DEPT = t2.DEPT AND t1.CLASS = t2.CLASS AND t1."DATE" = t2."DATE" AND t1.BOOK_ID = 100) WHEN MATCHED THEN -- 匹配成功就累加成本 UPDATE SET t1.TRANSFER_COST = t1.TRANSFER_COST + t2.TRANSFER_COST; COMMIT;
执行完任意一种方法后,查询表就能得到你想要的结果:
SELECT * FROM DAILY_DATA;
内容的提问来源于stack exchange,提问作者Imran Hemani
相关产品推荐
相关产品推荐

