Общий способ атаки на dups в таблице выглядит следующим образом.
1) определяет столбцы уникальных ключей - я использую в своем примере KEY1, KEY2
2) определить столбец, определяющий порядок - наибольшее значение сохраняется, все остальные значения рассматриваются как dups .Я использую ORDER1
Пример
create table tab as
select 1 key1, 1 key2, 1 order1 from dual union all -- dup
select 1 key1, 1 key2, 2 order1 from dual union all -- dup
select 1 key1, 1 key2, 3 order1 from dual union all
select 1 key1, 2 key2, 1 order1 from dual union all
select 2 key1, 1 key2, 1 order1 from dual union all -- dup
select 2 key1, 1 key2, 2 order1 from dual union all
select 2 key1, 2 key2, 1 order1 from dual;
Этот запрос идентифицирует дублирующиеся строки
select KEY1, KEY2, ORDER1 from
(select tab.*,
row_number() over (partition by key1, key2 order by order1 desc) as rn
from tab)
where rn > 1
KEY1 KEY2 ORDER1
---------- ---------- ----------
1 1 2
1 1 1
2 1 1
, и этот запрос удаляет двойники
delete from tab where (KEY1, KEY2, ORDER1) in
(select KEY1, KEY2, ORDER1 from
(select tab.*,
row_number() over (partition by key1, key2 order by order1 desc) as rn
from tab)
where rn > 1)
Замените имена таблиц и столбцов на TAB
, KEY1, KEY2
и ORDER1
.