-1

私は2つのテーブルを持っています

customer_master
> cname
> lastreceiptdate
> lastreceiptamt

accounts
> cname
> date
> amount

単一の更新クエリを作成するのに助けが必要です。ここで、customer_masterテーブルは、アカウントテーブルからの単一の顧客コード(「FRUITXXXXX」などのcname)の最新の受領日と受領金額で更新されます。

mysql5.0およびpostgresql9.0で動作するはずです

ありがとう

これまでのところ、selectコマンドを使用してmax(Date)でレコードを取得してから、別のupdateコマンドを使用してselectクエリの結果を使用して更新しています。

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

これは、最大 日付は「一意」です。つまり、同じ日付の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;

返された最大。金額は必ずしも最大に「属する」とは限りません。日付(別の日付からの金額である可能性があります)。

于 2012-11-03T08:20:52.580 に答える