トップページに戻る
次の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;
解説