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

3-43 更新可能なインラインビューでのwith句

SQLパズル

TargetTable
ID  Status
--  -----------
 1  WillUpdated
 2  WillDeleted
 4  WillMerged

with句を使ったインラインビュー経由で
・Update文
・Delete文
・Insert文
・Merge文
を実行する。

更新結果
ID  Status
--  -----------
 1  Updated
 3  Inserted
 4  Merged


データ作成スクリプト

create table TargetTable(ID,Status) as
select 1,'WillUpdated' from dual union all
select 2,'WillDeleted' from dual union all
select 4,'WillMerged'  from dual;


SQL

update (with tmp as(
        select * from TargetTable)
        select * from tmp)
set Status = 'Updated'
where ID = 1;

delete (with tmp as(
        select * from TargetTable)
        select * from tmp)
where ID = 2;

insert into TargetTable(ID,Status)
with tmp as(
select '3','Inserted' from dual)
select * from tmp;

merge into(with tmp1 as(
           select * from TargetTable)
           select * from tmp1) a
using (with tmp2(ID,Status) as(
       select '4','Merged' from dual)
       select * from tmp2) b
on (a.ID = b.ID)
when matched then
update set a.Status = b.Status;


解説

マニュアルに記述されている通り、Oracleのwith句は、select文の一部ですので、
select文が記述できる箇所では、with句を使うことができます。

ちなみに、select文のfrom句でのwith句の使用例は、下記になります。

select *
  from (with tmp(Val) as(
        select 123 from dual)
        select Val from tmp);

Val
---
123

また、select文のselect句でのスカラーサブクエリでのwith句の使用例は、下記になります。

select (with tmp(Val) as(
        select 123 from dual)
        select Val from tmp) as Test1,
       (with tmp(Val) as(
        select 456 from dual)
        select Val from tmp) as Test2
from dual;

Test1  Test2
-----  -----
  123    456


マニュアルのselect文のBNF select::= subquery_factoring_clause::= subquery::=
query_block::=