Как сохранить только одну строку таблицы, удалив повторяющиеся строки?
У меня есть таблица с большим количеством дубликатов в столбце Имя. Я бы
например, только для каждой строки.
Ниже перечислены дубликаты, но я не знаю, как удалить
дублировать и просто сохранить один:
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