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


解説

UpdatableViewで更新できるかは、
主キーもしくはユニークキーにより、更新する値が一意になるかどうかです。
この場合は、更新する値が一意になりますね。

2-1-3 select文の結果を使ってupdate
10-107 UpdatableViewで更新