Дополнительно
Как я могу удалить дубликаты строк?
Какой лучший способ удалить дубликаты строк из довольно большой таблицы SQL Server
(т.е. 300 000+ строк)?
Строки, конечно, не будут идеальными дубликатами из-за существования поля идентичности RowID
.
MyTable
RowID int not null identity(1,1) primary key,
Col1 varchar(20) not null,
Col2 varchar(2048) not null,
Col3 tinyint not null
1250
37
Предполагая отсутствие нулевых значений, вы
GROUP BY
уникальные столбцы иSELECT
MIN (или MAX)
RowId в качестве строки для сохранения. Затем просто удалите все, у кого не было идентификатора строки:Если у вас есть GUID вместо целого числа, вы можете заменить
с
Другой возможный способ сделать это
Я использую
ORDER BY (SELECT 0)
выше, так как произвольно сохранять ряд в случае ничьей.Например, чтобы сохранить последний в порядке
RowID
, вы можете использоватьORDER BY RowID DESC
Планы исполнения
План выполнения для этого часто проще и эффективнее, чем в принятом ответе, поскольку он не требует самостоятельного присоединения.
Однако это не всегда так. Одним из мест, где решение
GROUP BY
может быть предпочтительным, являются ситуации, когда агрегат hash будет выбран вместо агрегата потока.Решение
ROW_NUMBER
всегда будет давать практически один и тот же план, тогда как стратегияGROUP BY
является более гибкой.Факторы, которые могут способствовать подходу хеш-совокупности, будут
В крайних версиях этого второго случая (если в каждой очень мало групп с множеством дубликатов) можно также рассмотреть возможность простой вставки строк для сохранения в новой таблице, а затем «TRUNCATE» - оригинала и копирования их обратно, чтобы минимизировать регистрацию по сравнению с удалением очень высокой доли строк.
На сайте поддержки Microsoft есть хорошая статья о удалении дубликатов. Это довольно консервативно - они заставляют вас делать все за отдельные шаги - но это должно хорошо работать против больших столов.
Я использовал самообмановления, чтобы сделать это в прошлом, хотя это, вероятно, можно было бы притвориться оговоркой HAVING:
Следующий запрос полезен для удаления дубликатов строк. Таблица в этом примере имеет
ID
в качестве столбца идентификации, а столбцы, которые имеют дублирующие данные, -Column1
,Column2
иColumn3
.Следующий скрипт показывает использование
GROUP BY
,HAVING
,ORDER BY
в одном запросе и возвращает результаты с дублирующим столбцом и его счетом.Postgres:
Это удалит дубликаты строк, кроме первой строки
См. (Http://www.codeproject.com/Articles/157977/Remove-Duplicate-Rows-from-a-Table-in-SQL-Server)
Я бы предпочел CTE для удаления дубликатов строк из таблицы серверов sql
настоятельно рекомендуем следовать этой статье :: http://codaffection.com/sql-server-article/delete-duplicate-rows-in-sql-server/
Получить дубликаты строк:
Удалить дубликаты строк:
Быстро и грязно удалять точные дублированные строки (для небольших таблиц):
Я предпочитаю подзапрос \ имеющий count (*) > 1 решение для внутреннего соединения, потому что мне было легче читать, и было очень легко превратиться в оператор SELECT, чтобы проверить, что будет удалено, прежде чем запускать его.
Использование CTE. Идея состоит в том, чтобы присоединиться к одному или нескольким столбцам, которые образуют дублирующую запись, а затем удалить все, что вам нравится:
Я думал, что поделюсь своим решением, так как оно работает при особых обстоятельствах. В моем случае таблица с дублирующимися значениями не имела внешнего ключа (потому что значения были продублированы из другого db).
PS: при работе над такими вещами я всегда использую транзакцию, это не только гарантирует, что все выполнено в целом, но также позволяет мне тестировать, не рискуя ничем. Но, конечно, вы должны сделать резервную копию в любом случае, просто чтобы быть уверенным...
Этот запрос показал очень хорошую производительность для меня:
он удалил 1M строк чуть более чем за 30 секунд из таблицы 2M (50% дубликатов)
Еще одно простое решение можно найти по вставленной ссылке здесь. Этот легко понять и кажется эффективным для большинства подобных проблем. Это для SQL Server, но используемая концепция более чем приемлема.
Вот соответствующие части со связанной страницы:
Рассмотрим эти данные:
Так как мы можем удалить эти дубликаты данных?
Сначала вставьте столбец идентичности в эту таблицу, используя следующий код:
Используйте следующий код, чтобы решить его:
Вот еще одна хорошая статья о удалении дубликатов.
В нем обсуждается, почему это сложно: « SQL основан на реляционной алгебре, и дубликаты не могут встречаться в реляционной алгебре, потому что дубликаты не допускаются в множестве.»
Решение таблицы темпа и два примера mysql.
В будущем вы собираетесь предотвратить это на уровне базы данных или с точки зрения приложения. Я бы предложил уровень базы данных, потому что ваша база данных должна отвечать за поддержание целостности ссылок, разработчики просто вызовут проблемы;)
Да, конечно. Используйте временную таблицу. Если вы хотите одно, не очень эффективное утверждение, которое «работает», вы можете пойти с:
По сути, для каждой строки в таблице подвыбор находит верхний RowID всех строк, которые точно такие же, как рассматриваемая строка. Таким образом, вы получите список RowID, которые представляют «оригинальные» недублированные строки.
У меня была таблица, где мне нужно было сохранить не дубликаты строк. Я не уверен в скорости или эффективности.
Используйте это