Есть таблица KK_STUDENTS с единственным полем NAME - именами студентов.
Требуется убрать дубликаты, т.е. оставить каждое имя по 1 разу.
Создадим таблицу:
CREATE TABLE KK_STUDENTS
(
NAME varchar(50)
);
Заполним ее данными:
insert into KK_STUDENTS(NAME) values('Алексей');
insert into KK_STUDENTS(NAME) values('Сергей');
insert into KK_STUDENTS(NAME) values('Иван');
insert into KK_STUDENTS(NAME) values('Андрей');
insert into KK_STUDENTS(NAME) values('Иван');
insert into KK_STUDENTS(NAME) values('Алексей');
insert into KK_STUDENTS(NAME) values('Пётр');
insert into KK_STUDENTS(NAME) values('Алексей');
В каждой таблице есть системное поле ROWID, представляющее собой физический адрес строки. При апдейтах строк их ROWID не меняются. Поиск строки в большой таблице по заданному значению ROWID Oracle осуществляет очень быстро.
Посмотрим, какие записи вставились в таблицу:
select rowid, name from kk_students;
Вот эти записи мы оставим, а остальные удалим:
select name, min(rowid) from kk_students group by name;
Приведем delete, решающий задачу:
delete from kk_students
where rowid not in (select min(rowid) from kk_students group by name);
Если в таблице есть первичный ключ или другие уникальные ключи, то их можно использовать вместо ROWID для решения задачи удаления дубликатов.