我有两个表:
- 具有ID和Amount_due列的用户
- 具有ID、billed_tennes、User_ID的票据
我需要按ID对账单表中的所有billed_tennes求和,并按ID更新用户的amount_due。
以下是我目前正在尝试的没有运气的
UPDATE users
SET amount_due = (SELECT SUM(billed_cents) FROM bills INNER JOIN users ON bills.user_id = users.id WHERE someConditions)
FROM bills
WHERE users.id = bills.user_id
最有效的查询取决于未公开的细节。这在任何情况下都有效:
UPDATE users u
SET amount_due = b.sum_cents
FROM (
SELECT user_id, sum(billed_cents) AS sum_cents
FROM bills
WHERE <some conditions> -- maybe can go here? (better if possible)
GROUP BY 1
) b
WHERE u.id = b.user_id
-- AND <some conditions> -- may have to go here?
此表单不涉及子查询中的表users
(第二次(。
对于users
上的选择性过滤器,在聚合之前添加回接并过滤可能更有效。
参见:
- 使用引用主表的子查询进行更新
- 带有JSON对象数组聚合的LEFT JOIN查询
- 单个查询中的多个array_agg((调用