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

5-28 update文で連番に更新

SQLパズル

NoTableテーブル
No       data
--   --------
 1   ああああ
 2   いいい
 4   ううう
 9   5555

NoTableテーブルのNoを、連番に更新する。

更新結果
No       data
--   --------
 1   ああああ
 2   いいい
 3   ううう
 4   5555


データ作成スクリプト

create Table NoTable(
no number(1),
data varchar2(8));

insert into NoTable(No,data) values(1,'ああああ');
insert into NoTable(No,data) values(2,'いいい');
insert into NoTable(No,data) values(4,'ううう');
insert into NoTable(No,data) values(9,'5555');
commit;


SQL

--■■■相関サブクエリを使う方法■■■
update NoTable a
set No = (select count(b.No)+1 from NoTable b
           where b.No < a.No);

--■■■分析関数を使う方法■■■
update NoTable a
set No= (select Rank
           from (select RowID as Row_ID,
                 Row_Number() over(order by No) as Rank
                 from NoTable) b
          where b.Row_ID=a.RowID);

--■■■update前の大小関係を保持しない方法■■■
update NoTable set No = RowNum;


解説

update前の大小関係を保持しないのであれば、RowNumが使えます。