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

Oracle两表不同字段相减后更新指定字段的SQL写法咨询

错误原因

  • 字段引用错误:原SQL子查询中使用了不存在的member_point字段,member表存储余额的字段为member_money
  • 聚合逻辑错误:同一会员可能存在多条支付记录,未对pay_price求和就直接参与计算,同时非分组/非聚合字段出现在SELECT子句中会触发Oracle语法报错
  • 空值风险:如果对应会员没有支付记录,SUM()返回NULL,直接计算会导致member_money被更新为NULL,违反建表时的NOT NULL约束

解决方案

单会员更新(对应你原需求更新member_no=2的场景)

UPDATE MEMBER
SET member_money = member_money - NVL(
    (SELECT SUM(pay_price) 
     FROM MY_PAY 
     WHERE MY_PAY.member_no = MEMBER.member_no),
    0
)
WHERE member_no = 2;

全量更新所有会员余额

如果需要批量更新所有会员的余额,可以直接去掉上述SQL的WHERE条件,数据量大时更推荐使用MERGE写法优化性能:

MERGE INTO MEMBER m
USING (
    SELECT member_no, SUM(pay_price) AS total_pay
    FROM MY_PAY
    GROUP BY member_no
) p
ON (m.member_no = p.member_no)
WHEN MATCHED THEN
UPDATE SET m.member_money = m.member_money - p.total_pay;

内容的提问来源于stack exchange,提问作者송봉재

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:15:08