我有两张桌子
customer_master
> cname
> lastreceiptdate
> lastreceiptamt
accounts
> cname
> date
> amount
我需要帮助构建单个更新查询。其中customer_master
表更新了帐户表中单个客户代码(cname,如“FRUITXXXXX”)的最新收货日期和收货金额。
它应该在mysql 5.0和postgresql 9.0中运行
感谢
到目前为止,我们使用select命令检索具有max(Date)的记录,然后使用另一个更新命令来使用select查询的结果进行更新。
update customer_master
set receiptdate = @_da, receiptamt=@_amt
where cname = @_cn and (receiptdate < @_da or receiptdate='null')
答案 0 :(得分:2)
如果您需要为所有客户执行此操作,那么截断表格并将所有内容一次性插入将更快 批次 :
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;
返回的最大值金额不一定“属于”最大值。日期(可能是不同日期的金额)。