トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
10-260 3テーブルでのUpdatableView
SQLパズル
T1 T2 T3
ID1 Val ID1 ID2 ID2 Val
--- --- --- --- --- ---
1 AAA 1 100 100 XXX
2 BBB 3 200 200 YYY
T1テーブルのValを、
ID1を結合キーをして紐づくT2テーブルのID2を、結合キーとして
さらに紐づくT3テーブルのValでupdateする。
更新結果
T1
ID1 Val
--- ---
1 XXX
2 BBB
データ作成スクリプト
create table T1(
ID1 number(1) primary key,
Val char(3));
create table T2(
ID1 number(2),
ID2 number(3),
primary key(ID1));
create table T3(
ID2 number(3) primary key,
Val char(3));
insert all
into T1(ID1,Val) values(1,'AAA')
into T1(ID1,Val) values(2,'BBB')
into T2(ID1,ID2) values(1,100)
into T2(ID1,ID2) values(3,200)
into T3(ID2,Val) values(100,'XXX')
into T3(ID2,Val) values(200,'YYY')
select 1 from dual;
commit;
SQL
--■■■UpdatableViewを使う方法■■■
update (select t1.Val as oldVal,t3.Val as newVal
from T1,T2,T3
where t1.ID1 = t2.ID1
and t2.ID2 = t3.ID2)
set oldVal = newVal;
--■■■UpdatableViewを使わない方法■■■
update T1
set Val = (select T3.Val
from T2,T3
where t1.ID1 = t2.ID1
and t2.ID2 = t3.ID2)
where exists(select 1
from T2,T3
where t1.ID1 = t2.ID1
and t2.ID2 = t3.ID2);
--■■■mergeを使う方法(9iなら無意味なinsert文が必要)■■■
merge into T1 aa
using (select t1.RowID as Row_ID,t3.Val as newVal
from T1,T2,T3
where t1.ID1 = t2.ID1
and t2.ID2 = t3.ID2) bb
on (aa.RowID=bb.Row_ID)
when matched then
update set aa.Val= bb.newVal;
解説