すべての顧客に対してこれを行う必要がある場合は、テーブルを切り捨ててすべてを一度に挿入する方がはるかに高速です。
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
これは、最大 日付は「一意」です。つまり、同じ日付の2つの行がに存在しません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で機能するかどうかはわかりませんが)
最新の受領日に「属する」正しい金額を取得するには、groupbyステートメントに参加する必要があることに注意してください。
シンプルなものを使うなら
select cname,
max(date),
max(amount)
from accounts;
返された最大。金額は必ずしも最大に「属する」とは限りません。日付(別の日付からの金額である可能性があります)。