トップページに戻る
   次のSQLパズルへ
   前のSQLパズルへ
13-1  履歴の最後以外の行をDelete
SQLパズル
IDごとで、seqが最大でない行をDeleteする
テーブル
ID   seq
---  ---
aaa    1  ← Delete対象の行
aaa    2  ← Delete対象の行
aaa    3
bbb    1
データ作成スクリプト
create table TestTable(
ID  varchar(10),
seq int);
insert into TestTable values
('aaa',1),
('aaa',2),
('aaa',3),
('bbb',1);
SQL
-- ■■■ Exists述語を使う方法 ■■■
delete from TestTable
 where exists(select 1 from (select * from TestTable) as tmp
               where TestTable.ID = tmp.ID
                 and TestTable.seq < tmp.seq);
-- ■■■ マルチカラムIn述語を使う方法 ■■■
delete from TestTable
 where (ID,seq) Not In(select tmp.ID,max(tmp.seq)
                         from (select * from TestTable) tmp
                        group by tmp.ID);
解説
マルチカラムIn述語を使う方法が
分かりやすいと思います。