В 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
.