<<На Главную     <В  Советы по MS SQL Server

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

 

 

 

Строго говоря,  информационная система должна быть спроектирована и реализована таким образом, чтобы исключить возможность появления записей-двойников. Но что делать , если двоящиеся записи всё-таки появились в ваших справочниках? Ниже и будет рассмотрено несколько простых приемов, которые возможно  могут вам пригодиться для анализа и работы с двоящимися строками.

В качестве простого наглядного примера предположим, что имеется табличка Справочника товаров Tovary, в которой по каким-то причинам есть дубликаты строк. Структура таблицы для наших учебных целей будет предельно простой - уникальный идентификатор id и собственно наименование товара в поле Tovar:

Повторяющиеся записи MS SQL

 

Эта табличка совсем простая - в ней всего 26 записей и дубли строк можно обнаружить визуально. А теперь представьте, что таких записей десятки или сотни тысяч. Тут уж 'глазками' вычислить двойников будет трудновато. Попробуем решить эту проблему с использование SQL-запросов. Начнем пожалуй с самой простой конструкции по подсчету количества повторений .

 

Прим.  Если нет опыта, то  можно для начала посмотреть информацию о составлении простейших  запросов в этой статье

 

Набираем такой запрос Select Tovar, Count(*) from Tovary Group by Tovar order by Tovar , и получаем сл. результат:

 

Некоторые комментарии. В указанном запросе предложением Count(*) ... Group by считаем количество повторов, а конструкцией Order by сортируем товары по наименованию.

В результирующей табличке наглядно видно, что товар Самовар у нас повторяется 3 раза, а Утюг -2.

 

Так. Теперь попробуем выбрать только те товары, у которых есть повторения. Сделать это можно таким запросом -  Select Tovar, Count(*) from Tovary Group by Tovar having Count(*) > 1

 

Конструкцией having Count(*) > 1 мы выбрали только те записи, у которых есть повторения

 

Чтобы подготовить список только неповторяющихся записей, можно воспользоваться модификатором Distinct -  Select distinct tovar from Tovary:

 

 

 

Следующий текст запроса

 

Select id, Tovar from Tovary where Tovar in (

Select Tovar from Tovary Group by Tovar having Count(*) >1)

 

поможет вывести 'локализацию' записей-дубликатов по уникальному полю id в исходной табличке:

 

 

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

 

Delete from t from tovary t, tovary v

where t.tovar = v.tovar

and t.id > v.id

 

 

Прим. Для выполнения вышеприведенного запроса в таблице нужно иметь столбец с уникальным id. Если такового нет - придется каким-то образом создавать его. Как это можно сделать - смотрите в следующем Совете 28.

 

В результате получим лекарство от головной боли - двоящиеся товары (в случае нашего примера) будут удалены! :

 

 

 

Другим вариантом запроса на удаление записей-дубликатов может быть следующая конструкция с использованием функции row_number():

 

WITH DeleteDouble

AS (

SELECT tovar, row_number() OVER (PARTITION BY tovar ORDER BY tovar) rn

FROM Tovary

)

 

DELETE

FROM DeleteDouble

WHERE rn > 1

 

 

В этом случае даже нет необходимости создавать дополнительное поле id с уникальным ключом.

 

Еще несколько полезных советов для пользователей о работе с MS SQL Server  можно посмотреть здесь

Simashkov.2014

25.10.2014 г.

Назад