如果您需要为所有客户执行此操作,那么截断表并一次性插入所有内容会快得多:
truncate table customer_master;
insert into customer_master (cname, lastreceiptdate, lastreceiptamt)
select cname, last_date, last_amount
from amounts
join (
select cname,
max(date) as max_date
from accounts
group by cname
) ma on ma.max_date = amounts.date
and ma.cname = amounts.cname
这假设最大。date 是“唯一的”,即在 中不存在具有相同日期的两行accounts
。
如果您真的非常想在每次发生变化时更新表格,您可以使用以下内容:
update customer_master
set lastreceiptdate = last_date,
lastreceiptamt = last_amount
from (
select cname, last_date, last_amount
from amounts
join (
select cname,
max(date) as max_date
from accounts
group by cname
) ma on ma.max_date = amounts.date
and ma.cname = amounts.cname
) as t
where customer_master.cname = t.cname
and customer_master.cname = 'some customer name';
customer_master.cname = 'some customer name'
为单个客户而不是所有客户运行更新。(我不知道这是否适用于 MySQL)
请注意,您确实需要在 group by 语句中加入才能获得“属于”最新收据日期的正确金额。
如果你使用一个简单的
select cname,
max(date),
max(amount)
from accounts;
返回的最大值。金额不一定“属于”最大值。日期(可能是来自不同日期的金额)。