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

5-3 RowIDを使用した、同一レコードかのチェック

SQLパズル

tableABC
ColA  ColB
----  ----
  10   AAA
  10   XXX
  20   BBB
  30   CCC
  30   YYY
  30   ZZZ
  40   DDD

tableABCの、
ColAの値が重複している行を削除して1行にする(削除対象のColBの値は任意)

削除結果
tableABC
ColA  ColB
----  ----
  10   AAA
  20   BBB
  30   YYY
  40   DDD


データ作成スクリプト

create table tableABC(
ColA number,
ColB char(3));

insert into tableABC(ColA,ColB) values(10,'AAA');
insert into tableABC(ColA,ColB) values(10,'XXX');
insert into tableABC(ColA,ColB) values(20,'BBB');
insert into tableABC(ColA,ColB) values(30,'CCC');
insert into tableABC(ColA,ColB) values(30,'YYY');
insert into tableABC(ColA,ColB) values(30,'ZZZ');
insert into tableABC(ColA,ColB) values(40,'DDD');
commit;


SQL

--■■■exists述語を使用■■■
delete from tableABC a
where exists(select 1 from tableABC b
              where a.ColA  = b.ColA
                and a.RowID < b.RowID);

--■■■minusを使用■■■
delete from tableABC a
where RowID in (select b.RowID from tableABC b
          minus select max(b.RowID) from tableABC b group by b.ColA);

--■■■分析関数を使用1■■■
delete from tableABC a
where RowID not in (select max(b.RowID) over(partition by b.ColA) from tableABC b);

--■■■分析関数を使用2■■■
delete from tableABC a
where RowID in (select Lag(b.RowID) over(partition by b.ColA order by b.RowID)
                  from tableABC b);


解説

RowIDを比較することによって、
同一レコードかのチェックを行うことができます。