按ID汇总Bills表金额并更新Users表Amount_due字段
解决方法
你的SQL问题出在两个地方:
- 子查询里重复关联了Users表,且未和外层的Users行绑定,导致子查询返回的是所有符合条件的账单总和,而非单个用户的对应总和
- UPDATE的语法格式不符合标准写法,不同数据库的UPDATE JOIN语法存在差异
下面分两种常用数据库给出正确写法:
1. MySQL 写法
用UPDATE JOIN直接关联汇总后的账单数据:
UPDATE users u JOIN ( SELECT user_id, SUM(billed_cents) AS total_billed FROM bills -- 在此处添加你的筛选条件 WHERE someConditions GROUP BY user_id ) b ON u.id = b.user_id SET u.amount_due = b.total_billed;
2. 通用写法(适用于PostgreSQL、SQL Server等)
用子查询关联,确保每个用户匹配自己的账单总和:
UPDATE users SET amount_due = ( SELECT SUM(billed_cents) FROM bills WHERE bills.user_id = users.id -- 在此处添加你的筛选条件 AND someConditions ) -- 可选:若只想更新有账单记录的用户,保留以下条件 WHERE EXISTS ( SELECT 1 FROM bills WHERE bills.user_id = users.id );
补充说明
- 若要更新所有用户(包括无账单的用户,这类用户的
amount_due会被设为NULL),可去掉最后的WHERE EXISTS子句 - 将
someConditions替换为你实际的筛选条件,比如时间范围、账单状态等
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

