Удаление дублирующих записей в таблице MS SQL Server

Введение

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

Как быть, если вам необходимо избавиться от дублей по одному полю. В некоторых СУБД есть специальные функции и средства, которые помогают это сделать, но есть один универсальный способ, который подойдет почти для любой СУБД – удаление дублей при помощи SQL-запросов.

Я расскажу как минимум два способа удаления дублирующих записей с использованием SQL-запросов, а также способ с использованием функции row_number, но данный способ подойдет только для MS SQL Server.

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

Удаление дублей при помощи SQL-запроса

Давайте сначала визуально посмотрим на небольшой таблице, какие дубли у нас в ней присутствуют. Конечно, если у вас таблица с тысячами записей, то это визуально сделать будет сложно, но при помощи SQL-запроса эту проблему решим быстро. Итак, у нас имеется небольшая таблица с дублирующими записями по определенному полю:

Дубли в таблице SQL Server
Дубли в таблице SQL Server

Визуально нам видно, что по полю NAME_GOODS имеются два наименования, которые встречаются несколько раз. Если же у вас таблица огромная и визуально не можете определить, имеются ли у вас в ней дублирующие записи по определенному полю, то можно воспользоваться следующим SQL-запросом:

SELECT NAME_GOODS, COUNT(*) AS COL_POVTOR FROM Price 
GROUP BY NAME_GOODS HAVING COUNT(*) > 1

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

Дублирующие записи в таблице SQL Server
Дублирующие записи в таблице SQL Server

Теперь нам необходимо избавиться от этих дублей. Необходимо выполнить будет еще один SQL-запрос. Но он будет работать только в том случае, если в вашей таблице присутствует уникальное поле-идентификатор. В нашей таблице имеется поле KOD, по которому мы и будем определять, какую запись оставить в таблице, а какую удалить. Если вы хотите вывести список дублей и увидеть, какой уникальный идентификатор соответствует определенной записи, то необходимо воспользоваться следующим SQL-запросов:

SELECT KOD, NAME_GOODS FROM Price WHERE NAME_GOODS IN (
SELECT NAME_GOODS FROM Price GROUP BY NAME_GOODS HAVING COUNT(*) > 1)
ORDER BY NAME_GOODS

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

Дубли с идентификаторами в таблице SQL Server
Дубли с идентификаторами в таблице SQL Server

Теперь приступим к удалению дублирующих записей. Это делается при помощи запроса, причем это можно сделать несколькими видами SQL-запросов. Первый вариант, использовать следующий SQL-запрос:

DELETE FROM tab1 FROM Price tab1, Price tab2
WHERE tab1.NAME_GOODS = tab2.NAME_GOODS
AND tab1.KOD > tab2.KOD

Здесь необходимо обратить внимание на то, что в условии запроса по полю KOD мы оставляем запись с наименьшим значением, можно поменять знак равенства и все будет наоборот, но смысл останется тем же, останется  только одна запись в таблице, а все дублирующие будут удалены:

Удаление дубликатов в таблице SQL Server
Удаление дубликатов в таблице SQL Server

Второй вариант SQL-запроса для удаления дублирующих записей будет следующим:

DELETE tab1 FROM Price tab1 
LEFT JOIN Price tab2 ON tab1.NAME_GOODS = tab2.NAME_GOODS 
AND tab1.KOD > tab2.KOD WHERE tab2.KOD IS NOT NULL

Данный вариант отличается лишь текстом SQL-запроса, а результат будет таким же.

Удаление дублей при помощи функции row_number

В MS SQL Server есть еще один вариант удаления дублирующих записей – использование функции row_number. Для этого необходимо использоваться следующую конструкцию:

WITH DelDouble
AS (
SELECT NAME_GOODS, ROW_NUMBER() OVER 
(PARTITION BY NAME_GOODS ORDER BY NAME_GOODS) ncount
FROM Price
)
DELETE
FROM DelDouble
WHERE ncount > 1

Здесь нюанс заключается в том, что этот способ будет работать только в MS SQL Server, если конечно в других СУБД нет похожей функции row_number. Данный способ также имеет большой плюс в его использовании: нет необходимости использовать в своей таблице уникальное поле-идентификатор.

Заключение

Если у вас СУБД не MS SQL Server, то вам как минимум один из данных способов подойдет для удаления дублирующих записей в таблице. Так как первые два способа используют SQL-запрос DELETE, а сейчас все СУБД поддерживают данный синтаксис.

Для некоторых СУБД существуют различные  инструменты, при помощи которых можно также искать и затем удалять дубли в таблицах. Например, для Oracle можно воспользоваться Toad for Oracle. Но если же вы работаете без оболочки с БД, например из среды разработки, то здесь вам уже не обойтись без методов с использованием SQL-запросов.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Была ли эта статья полезна?

Статьи по теме

Оставить комментарий

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