トップページに戻る    次の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述語を使う方法が
分かりやすいと思います。