SQL事务表中的主表中的SQL更新列

时间:2012-11-03 06:35:41

标签: mysql sql postgresql

我有两张桌子

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') 

1 个答案:

答案 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;

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