Как эффективно сохранить дублирующуюся запись и удалить все ее дубликаты? - PullRequest
0 голосов
/ 28 января 2020

Этот запрос звучал как очень простой, но в случае реализации он звучал так же просто, как и выглядел.

Мой подход

   Delete from
    Table where id IN(
   Select id from 
   ( Select id, 
   row_number() 
 Over (partition by id
   Order by id 
  ) as 
   Rn
   from
  Table )where rn>1)

Ответы [ 2 ]

2 голосов
/ 28 января 2020

В Oracle это часто обрабатывается с использованием rowid:

delete from t
    where rowid not in (select min(rowid) from t group by id);

Если у вас есть индекс для id, я бы сказал это следующим образом:

delete from t
    where rowid <> (select min(rowid) from t t2 where t2.id = t.id);

РЕДАКТИРОВАНИЕ:

Единственный стандартный способ выполнить sh - это очистить таблицу и заново вставить данные. И даже это имеет настройки в зависимости от базы данных.

create table t_temp as
select t.*
from (select t.*, row_number() over (partition by id order by id) as seqnum
      from t
     ) t
where seqnum = 1;

alter table t_temp drop column seqnum;

truncate table t;   -- back it up first!

insert into t
    select *
    from t_temp;

Это также стоит учитывать, если у вас много дубликатов. Если вы удаляете значительную часть строк, это может быть более эффективным.

Примечание. Не все базы данных поддерживают create table as. Те, которые не часто поддерживают select into.

0 голосов
/ 28 января 2020

Вы можете использовать exists следующим образом:

Delete from table_name t
Where exists 
      (Select 1
         From table_name t1
        Where t.id = t1.id
          And t.rowid > t1.rowid)

Ура !!

...