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

7-8 プライマリキーの入れ替え

SQLパズル

武将テーブル
番号    名前
----  ------
10    源義経
27    源頼朝
35    平清盛
46    平知盛

番号を、次に大きい番号に更新する(番号が最大のデータは、最小の番号に更新する)

更新結果
番号    名前
----  ------
10    平知盛
27    源義経
35    源頼朝
46    平清盛


データ作成スクリプト

create table 武将(
番号 number(2),
名前 char(6),
primary key(番号));

insert into 武将 values('10','源義経');
insert into 武将 values('27','源頼朝');
insert into 武将 values('35','平清盛');
insert into 武将 values('46','平知盛');
commit;


SQL

--■■■case式と相関サブクエリを使う方法■■■
update 武将 a
set 番号 = case when a.番号 =(select max(b.番号) from 武将 b)
                then (select min(b.番号) from 武将 b)
                else (select min(b.番号) from 武将 b where b.番号 > a.番号) end;

--■■■分析関数を使う方法1■■■
update 武将 a
set 番号 =
(select b.更新番号
   from (select
         c.番号,
         Lead(c.番号,1,(select min(cc.番号) from 武将 cc)) over(order by c.番号) as 更新番号
         from 武将 c) b
 where b.番号=a.番号);

--■■■分析関数を使う方法2■■■
update 武将 a
set 番号 =
(select b.更新番号
   from (select
         c.番号,
         nvl(Lead(c.番号,1) over(order by c.番号),min(c.番号) over(order by c.番号)) as 更新番号
         from 武将 c) b
 where b.番号=a.番号);


解説

自己結合と相関サブクエリは、
分析関数で代用できることがあります。