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

У меня есть таблица с большим количеством дубликатов в столбце Имя. Я бы например, только для каждой строки.

Ниже перечислены дубликаты, но я не знаю, как удалить дублировать и просто сохранить один:

SELECT name FROM members GROUP BY name HAVING COUNT(*) > 1;

Спасибо.

Ответ 1

См. следующий вопрос: Удаление повторяющихся строк из таблицы.

Адаптированный принятый ответ оттуда (это мой ответ, поэтому нет "кражи" здесь...):

Вы можете сделать это простым способом, считая, что у вас есть уникальное поле ID: вы можете удалить все записи, которые являются одинаковыми, за исключением ID, но не имеют "минимального идентификатора" для их имени.

Пример запроса:

DELETE FROM members
WHERE ID NOT IN
(
    SELECT MIN(ID)
    FROM members
    GROUP BY name
)

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

Ответ 2

Вероятно, было бы легче выбрать уникальные в новую таблицу, удалить старую таблицу, а затем переименовать временную таблицу, чтобы заменить ее.

#create a table with same schema as members
CREATE TABLE tmp (...);

#insert the unique records
INSERT INTO tmp SELECT * FROM members GROUP BY name;

#swap it in
RENAME TABLE members TO members_old, tmp TO members;

#drop the old one
DROP TABLE members_old;

Ответ 3

У нас есть огромная база данных, где удаление дубликатов является частью обычного процесса обслуживания. Мы используем DISTINCT для выбора уникальных записей, а затем записываем их в ВРЕМЕННЫЙ ТАБЛИЦ. После TRUNCATE мы записываем ВРЕМЕННЫЕ данные в ТАБЛИЦУ.

Это один из способов сделать это и работает как ЗАПОМНЕННАЯ ПРОЦЕДУРА.

Ответ 4

Если мы хотим сначала увидеть, какие строки вы собираетесь удалить. Затем удалите их.

with MYCTE as (
    SELECT DuplicateKey1
        ,DuplicateKey2 --optional
        ,count(*) X
    FROM MyTable
    group by DuplicateKey1, DuplicateKey2
    having count(*) > 1
) 
SELECT E.*
FROM MyTable E
JOIN MYCTE cte
ON E.DuplicateKey1=cte.DuplicateKey1
    AND E.DuplicateKey2=cte.DuplicateKey2
ORDER BY E.DuplicateKey1, E.DuplicateKey2, CreatedAt

Полный пример в http://developer.azurewebsites.net/2014/09/better-sql-group-by-find-duplicate-data/

Ответ 5

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

DELETE FROM tablename
WHERE id NOT IN(

 SELECT id FROM
(
    SELECT MIN(id)AS id
    FROM tablename
    GROUP BY name HAVING 
    COUNT(*) > 1
)AS a )
AND id NOT IN(
(SELECT ids FROM
(
SELECT MIN(id)AS ids
    FROM tablename
    GROUP BY name HAVING 
    COUNT(*) =1
)AS a1
)
)

перед тем, как удалить таблицу ниже, см. скриншот: введите описание изображения здесь после удаления таблицы ниже см. скриншот этого запроса, удалите amit и akhil дубликаты строк и сохраните одну запись (amit и akhil):

введите здесь описание изображения

Ответ 6

Вы можете присоединить таблицу к себе с помощью сопоставленного поля и удалить unmatching rows

DELETE t1 FROM table_name t1 
LEFT JOIN tablename t2 ON t1.match_field = t2.match_field
WHERE t1.id <> t2.id;

Ответ 7

если вы хотите удалить дубликат записи из таблицы.

CREATE TABLE tmp SELECT lastname, firstname, sex
FROM user_tbl;
GROUP BY (lastname, firstname);

DROP TABLE user_tbl;

ALTER TABLE tmp RENAME TO user_tbl;

Ответ 8

WITH CTE AS
(
    SELECT ROW_NUMBER() OVER (PARTITION BY [emp_id] ORDER BY [emp_id]) AS Row, * FROM employee_salary
)


DELETE FROM CTE
WHERE ROW <> 1