トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-60 ポイントをmerge

SQLパズル

Pointテーブル
会員    店舗   ポイント
------  ----  --------
準会員   店1        10
準会員   店2        20
正会員   店1        20
正会員   店3        15

準会員のレコードを、
正会員の、店舗が一致するレコードに、
upsert(追加更新)する(更新時はポイントを加算)

更新結果
会員    店舗   ポイント
------  ----  --------
準会員   店1        10
準会員   店2        20
正会員   店1        30  ←10+20
正会員   店2        20
正会員   店3        15


データ作成スクリプト

create table Point(
会員     char(6),
店舗     char(3),
ポイント number(2));

insert into Point values('準会員','店1',10);
insert into Point values('準会員','店2',20);
insert into Point values('正会員','店1',20);
insert into Point values('正会員','店3',15);
commit;


SQL

merge into Point a
using (select 店舗,sum(ポイント) as ポイント
         from Point
        where 会員 = '準会員'
        group by 店舗) b
on (a.会員 = '正会員' and a.店舗 = b.店舗)
when matched then
update set a.ポイント = a.ポイント + b.ポイント
when not matched then
insert(a.会員,a.店舗,a.ポイント) values('正会員',b.店舗,b.ポイント);


解説

mergeを使うと、upsert(追加更新)することができます