Intereting Posts

Как удалить дубликаты записей в SQL

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

В SQL Server 2005 и выше:

 WITH q AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY dup_column ORDER BY dup_column) AS rn FROM mytable ) DELETE FROM q WHERE rn > 1 

Вот как это сделать в Oracle, используя ROWID. Различные вкусы РСУБД будут иметь свой собственный эквивалент.

Я начинаю с создания дубликатов записей …

 SQL> select t, count(*) from t23 group by t; T COUNT(*) ----- ---------- 09:00 2 12:00 2 10:30 2 11:00 2 12:30 2 08:00 2 10:45 2 11:15 2 8 rows selected. SQL> 

… и теперь я их блокирую, используя T для определения «дубликатов записей» …

 SQL> delete from t23 2 where rowid > ( select min(rowid) from t23 x 3 where xt = t23.t ) 4 / 8 rows deleted. SQL> select t, count(*) from t23 group by t; T COUNT(*) ----- ---------- 09:00 1 12:00 1 10:30 1 11:00 1 12:30 1 08:00 1 10:45 1 11:15 1 8 rows selected. SQL> 

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

Кстати, самый эффективный способ сделать это – не иметь дубликатов записей в первую очередь. Именно поэтому Природа дала нам первичные ключи и уникальные ограничения.

Поскольку у вас нет ключа в таблице (при условии, что ваши строки дублируются на 100%), у вас не будет проблем с другими таблицами, ссылающимися на вашу таблицу с помощью FOREIGN KEY.

Самый быстрый и наименее сложный способ сделать это:

 SELECT DISTINCT * INTO #tmp FROM YourTable; TRUNCATE TABLE YourTable; INSERT YourTable SELECT * from #tmp; 

Может быть, подумайте о добавлении некоторой версии этого утверждения в конец 😉

 ALTER YourTable ADD CONSTRAINT PK_YourTable PRIMARY KEY (whatever, keeps, this, from, happening, again); 

В Postgresql я использую следующее:

 DELETE FROM table_name q WHERE EXISTS ( SELECT 1 FROM table_name q1 WHERE q1.ctid < q.ctid AND q.fid = q1.fid ); 

Где fid – ваш уникальный идентификационный номер или первичный ключ.

В MS SQL,

 DELETE Table1 FROM Table1 INNER JOIN ( SELECT MAX(lineitem) AS lineitem, ID, COUNT (ID) AS IDCount FROM Table1 GROUP BY ID HAVING COUNT (ID) > 1) AS Table2 ON Table1.ID = Table2.ID and Table1.LineItem = Table2.lineitem 

Выше SQL найдет все дубликаты ID и удалит один из них с максимальным значением LineItem.

 ID LineItem --- -------- 111 1 111 2 (Deleted) 222 1 222 2 (Deleted) 

В Oracle мы можем сделать это разными способами.

1) Создав новую таблицу:

 create table emp2 as select distinct * from EMP; drop table emp; alter table emp2 rename to emp; 

2) Используя RowID:

 delete from EMP where rowid not in ( select max(rowid) from EMP group by EMPNO, EMPNAME, SALARY); 

3) Используя Self Join и RowID:

 delete from emp e1 where rowid not in( select max(rowid) from EMP e2 where e1.EMPNO = e2.EMPNO); 

выберите col из таблицы;

выберите отдельный столбец из таблицы;