トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
5-8 update文で相関サブクエリ
SQLパズル
TAB_A TAB_B
X Y L M
-- -- -- --
1 9 1 3
2 9
TAB_A.XとTAB_B.Lを結合し、TAB_A.Y列をTAB_B.M列の値で更新する。
TAB_A.Xに結合するTAB_B.Lの値が存在しないときは0で更新する。
(TAB_A.XとTAB_B.L列はプライマリキー)
更新結果
TAB_A
X Y
-- --
1 3
2 0
データ作成スクリプト
create table TAB_A(
X number(1),
Y number(1));
create table TAB_B(
L number(1),
M number(1));
insert into TAB_A(X,Y) values(1,9);
insert into TAB_A(X,Y) values(2,9);
insert into TAB_B(L,M) values(1,3);
commit;
SQL
--■■■nvl関数を使用■■■
update TAB_A a
set Y = nvl((select b.M from TAB_B b
where b.L = a.X),0);
--■■■case when existsを使用■■■
update TAB_A a
set Y = case when exists(select 1 from TAB_B b where b.L = a.X)
then (select b.M from TAB_B b where b.L = a.X)
else 0 end;
解説
update文でも、
テーブル名にエイリアスをつけての相関サブクエリを使用できます。
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
下記のUpdatableViewは、
ORA-01779(cannot modify a column which maps to a non key-preserved table)
になりました。
update (select a.Y as oldVal,nvl(b.M,0) as NewVal
from TAB_A a,TAB_B b
where a.X = b.L(+))
set oldVal = NewVal;