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