如何使用连接执行 sql 更新语句?

How to do a sql update statement with a join?

我正在尝试使用来自另一个 table 的另一列的总和来执行更新语句。我要

customer_ar.current_bal to = sum(ar_transaction.current_balance)

作为测试,我 运行 为 5 个客户制作 customer_ar.current_bal=100:

update customer_ar
set current_bal=100
where customer_id in (1502,1329,3096,1516,3605);

接下来我运行这个:

update customer_ar C
join ar_transaction T on T.customer_id=C.customer_id
set current_bal =
(select sum(current_balance)
from ar_transaction
where C.customer_id =T.customer_id)
where C.customer_id in (1502,1329,3096,1516,3605);

我得到的结果是他们的余额都变成了213823.85。每个客户的实际当前余额应该都不同,在50到100之间。

我可以做一个子查询,如果我一次做一个,它就会工作,但我想看看是否有办法让它一次做所有的事情。你看到我做错了什么了吗?

我认为您需要对子查询中的行进行分组,以计算每个客户的交易总和。

也许是这样的(只是为了理解):

update customer_ar p
set current_bal = trans.sumBal
from customer_ar c
join (select customer_id, sum(current_bal) as sumBal from ar_transaction group by customer_id) trans on c.customer_id = trans.customer_id
where p.customer_id = trans.customer_id;

http://sqlfiddle.com/#!17/3dd88/14

更新: 抱歉发布无效 SQL。我刚刚修正了我的例子。

如果您使用的是 sql-server,您可以使用此脚本。

update customer_ar 
set current_bal = 
    (select sum(current_balance)
        from ar_transaction T1
     where T1.customer_id =customer_ar.customer_id)
where customer_id in (1502,1329,3096,1516,3605);