Обычно меры, предотвращающие появление нежелательных дубликатов имеющихся записей в таблицах, принимаются заранее. Но, не всегда они бывают достаточно эффективны и не всегда нужные действия принимаются своевременно.
В этой статье мы рассмотрим простой поиска дубликатов. В качестве примера используем СУБД Access.
Допустим у нас имеется таблица «Товары», которой хранится название товара и его цена. При этом один и тот же товар не может продаваться по разным ценам. Но, если мы посмотрим на скриншот для таких товаров, как хлеб и макароны существует 3 и 2 варианта цены соответственно, хотя по постановке задачи этого быть не должно.
По-хорошему, при создании таблицы нужно было добавить уникальный индекс для поля «Название», но это сделано не было.
Сейчас это сделать пока невозможно, т.к. добавление уникального индекса для поля с неуникальными записями вызовет ошибку и такой индекс не будет добавлен.
Поэтому перед добавлением индекса нужно найти и затем удалить не нужные дубликаты.
Сразу отметим, что дубликаты могут быть полными (совпадают все поля, кроме первичного ключа (id)) или частичными (совпадает только часть полей). В нашем примере мы имеет дело с последними.
Для поиска любых дубликатов мы можем воспользоваться одним простым способом. Это запрос с группировкой для подсчёта количества записей при помощи функции count и отбором записей количество которых составляет 2 и более.
В нашем случае требуется найти дубликаты по полю «Название» и потому данный запрос будет выглядеть следующим образом.
1 |
SELECT Название, COUNT(Код) AS Дубликатов FROM Товары GROUP BY Название HAVING COUNT(Код) >=2; |
Результат его выполнения:
Если при поиске дубликатов нужно учитывать несколько полей, то они добавляются в предложения SELECT и GROUP BY как показано ниже.
1 |
SELECT Артикул, Название, Категория, COUNT(Код) AS Дубликатов FROM Товары GROUP BY Артикул, Название, Категория HAVING COUNT(Код) >=2; |
Отличительной чертой метода рассматриваемого в данной статье является его универсальность, т.к. в нём используется стандартный функционал SQL, который позволяет не только искать почти любые дубликаты, но применять его в любой реляционной СУБД.
Добавить комментарий