-1

我有两张桌子

customer_master
> cname
> lastreceiptdate
> lastreceiptamt

accounts
> cname
> date
> amount

我需要帮助来构建单个更新查询。其中该customer_master表使用来自accounts 表的单个客户代码(cname,如“FRUITXXXXX”)的最新收款日期和收款金额进行更新。

它应该在 mysql 5.0 和 postgresql 9.0 中工作

谢谢

到目前为止,我们正在使用一个选择命令来检索具有 max(Date) 的记录,然后使用另一个更新命令来使用来自选择查询的结果进行更新。

update customer_master 
set receiptdate = @_da, receiptamt=@_amt 
where cname = @_cn and (receiptdate < @_da or receiptdate='null') 
4

1 回答 1

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;

返回的最大值。金额不一定“属于”最大值。日期(可能是来自不同日期的金额)。

于 2012-11-03T08:20:52.580 回答