Удаление повторяющихся строк из таблицы в Oracle - PullRequest
126 голосов
/ 09 февраля 2009

Я тестирую что-то в Oracle и заполнил таблицу некоторыми примерами данных, но в процессе этого я случайно загрузил дублирующиеся записи, поэтому теперь я не могу создать первичный ключ, используя некоторые столбцы.

Как удалить все повторяющиеся строки и оставить только одну из них?

Ответы [ 21 ]

259 голосов
/ 09 февраля 2009

Используйте псевдостолбец rowid.

DELETE FROM your_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM your_table
GROUP BY column1, column2, column3);

Где column1, column2 и column3 составляют идентификационный ключ для каждой записи. Вы можете перечислить все свои столбцы.

15 голосов
/ 18 марта 2011

С Спроси Тома

delete from t
 where rowid IN ( select rid
                    from (select rowid rid, 
                                 row_number() over (partition by 
                         companyid, agentid, class , status, terminationdate
                                   order by rowid) rn
                            from t)
                   where rn <> 1);

(исправлена ​​пропущенная скобка)

11 голосов
/ 09 ноября 2009
DELETE FROM tablename a
      WHERE a.ROWID > ANY (SELECT b.ROWID
                             FROM tablename b
                            WHERE a.fieldname = b.fieldname
                              AND a.fieldname2 = b.fieldname2)
11 голосов
/ 09 февраля 2009

С DevX.com :

DELETE FROM our_table
WHERE rowid not in
(SELECT MIN(rowid)
FROM our_table
GROUP BY column1, column2, column3...) ;

Где ключ1, столбец2 и т. Д. - это ключ, который вы хотите использовать.

7 голосов
/ 31 декабря 2015

Решение 1)

delete from emp
where rowid not in
(select max(rowid) from emp group by empno);

Решение 2)

delete from emp where rowid in
               (
                 select rid from
                  (
                    select rowid rid,
                      row_number() over(partition by empno order by empno) rn
                      from emp
                  )
                where rn > 1
               );

Решение 3)

delete from emp e1
         where rowid not in
          (select max(rowid) from emp e2
           where e1.empno = e2.empno ); 
6 голосов
/ 11 января 2013

создать таблицу t2 как выделенную * из t1;

3 голосов
/ 09 февраля 2009

Вы должны сделать небольшой блок pl / sql, используя курсор для цикла, и удалить строки, которые вы не хотите сохранять. Например:

declare
prev_var my_table.var1%TYPE;

begin

for t in (select var1 from my_table order by var 1) LOOP

-- if previous var equal current var, delete the row, else keep on going.
end loop;

end;
3 голосов
/ 17 июня 2014

Для выбора дубликатов может использоваться только формат запроса:

SELECT GroupFunction(column1), GroupFunction(column2),..., 
COUNT(column1), column1, column2...
FROM our_table
GROUP BY column1, column2, column3...
HAVING COUNT(column1) > 1

Таким образом, правильный запрос в соответствии с другим предложением:

DELETE FROM tablename a
      WHERE a.ROWID > ANY (SELECT b.ROWID
                             FROM tablename b
                            WHERE a.fieldname = b.fieldname
                              AND a.fieldname2 = b.fieldname2
                              AND ....so on.. to identify the duplicate rows....)

Этот запрос сохранит самую старую запись в базе данных для критериев, выбранных в WHERE CLAUSE.

Oracle Certified Associate (2008)

2 голосов
/ 07 января 2017
DELETE from table_name where rowid not in (select min(rowid) FROM table_name group by column_name);

и вы также можете удалить дубликаты записей другим способом

DELETE from table_name a where rowid > (select min(rowid) FROM table_name b where a.column=b.column);
2 голосов
/ 03 июля 2017
create table abcd(id number(10),name varchar2(20))

insert into abcd values(1,'abc')

insert into abcd values(2,'pqr')


insert into abcd values(3,'xyz')

insert into abcd values(1,'abc')

insert into abcd values(2,'pqr')

insert into abcd values(3,'xyz')


select * from abcd
id  Name
1   abc
2   pqr
3   xyz
1   abc
2   pqr
3   xyz

Delete Duplicate record but keep Distinct Record in table 

DELETE 
FROM abcd a
WHERE ROWID > (SELECT MIN(ROWID) FROM abcd b
WHERE b.id=a.id
);

run the above query 3 rows delete 

select * from abcd

id  Name 
1   abc
2   pqr
3   xyz
...