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

2-1-3 select文の結果を使ってupdate

SQLパズル

Table1                    Table2
PKey  Val1  Val2  Val3    PKey  Val1  Val2  Val3
----  ----  ----  ----    ----  ----  ----  ----
  10  aaaa  bbbb  cccc      10  xxxx  yyyy  zzzz
  20  dddd  eeee  ffff      30  1111  2222  3333

Table1のPKeyに紐づく、Table2の値を使って、Table1のVal1,Val2,Val3をupdateする。
ただし、Table2に紐づくレコードが存在するレコードのみを対象とする。

Table1、Table2のプライマリキーは、PKeyとする。

更新結果
Table1
PKey  Val1  Val2  Val3
----  ----  ----  ----
  10  xxxx  yyyy  zzzz
  20  dddd  eeee  ffff


データ作成スクリプト

create table Table1(PKey primary key,Val1,Val2,Val3) as
select 10,'aaaa','bbbb','cccc' from dual union
select 20,'dddd','eeee','ffff' from dual;

create table Table2(PKey primary key,Val1,Val2,Val3) as
select 10,'xxxx','yyyy','zzzz' from dual union
select 30,'1111','2222','3333' from dual;


SQL

--■■■select文の結果を使ってupdateする方法■■■
update Table1 a
set(Val1,Val2,Val3) =(select b.Val1,b.Val2,b.Val3 from Table2 b
                       where b.PKey=a.PKey)
where exists(select 1 from Table2 b
              where b.PKey = a.PKey);

--■■■UpdatableViewを使う方法■■■
update (select a.Val1 as oldVal1,a.Val2 as oldVal2,a.Val3 as oldVal3,
               b.Val1 as newVal1,b.Val2 as newVal2,b.Val3 as newVal3
          from Table1 a join Table2 b
         using (PKey))
set oldVal1 = newVal1,
    oldVal2 = newVal2,
    oldVal3 = newVal3;

--■■■mergeを使う方法(9iなら無意味なinsert文が必要)■■■
merge into Table1 aa
using (select a.RowID as Row_ID,
       b.Val1 as newVal1,b.Val2 as newVal2,b.Val3 as newVal3
         from Table1 a Join Table2 b
        using (PKey)) bb
   on (aa.RowID=bb.Row_ID)
when matched then
update set aa.Val1= bb.newVal1,
           aa.Val2= bb.newVal2,
           aa.Val3= bb.newVal3;


解説

単一行複数列問い合わせのselect文の結果を使って、updateできます。
UpdatableViewを使ってもいいでしょう。

10-107 UpdatableViewで更新
10-260 3テーブルでのUpdatableView