Простой поиск дубликатов записей в таблицах (на примере Access)

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

В этой статье мы рассмотрим простой поиска дубликатов. В качестве примера используем СУБД Access.

Допустим у нас имеется таблица «Товары», которой хранится название товара и его цена. При этом один и тот же товар не может продаваться по разным ценам. Но, если мы посмотрим на скриншот для таких товаров, как хлеб и макароны существует 3 и 2 варианта цены соответственно, хотя по постановке задачи этого быть не должно.

Лирическое отступление

По-хорошему, при создании таблицы нужно было добавить уникальный индекс для поля «Название», но это сделано не было.

Сейчас это сделать пока невозможно, т.к. добавление уникального индекса для поля с неуникальными записями вызовет ошибку и такой индекс не будет добавлен.

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

Сразу отметим, что дубликаты могут быть полными (совпадают все поля, кроме первичного ключа (id)) или частичными (совпадает только часть полей). В нашем примере мы имеет дело с последними.

Для поиска любых дубликатов мы можем воспользоваться одним простым способом. Это запрос с группировкой для подсчёта количества записей при помощи функции count и отбором записей количество которых составляет 2 и более.

В нашем случае требуется найти дубликаты по полю «Название» и потому данный запрос будет выглядеть следующим образом.

Результат его выполнения:

Если при поиске дубликатов нужно учитывать несколько полей, то они добавляются в предложения SELECT и GROUP BY как показано ниже.

Отличительной чертой метода рассматриваемого в данной статье является его универсальность, т.к. в нём используется стандартный функционал SQL, который позволяет не только искать почти любые дубликаты, но применять его в любой реляционной СУБД.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *