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,提问作者송봉재
相关产品推荐
相关产品推荐

