You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 19:07:43