Удаление дублирующихся записей

Удаление дублирующихся записей

При ведении банка данных довольно часто приходится удалять повторяющиеся записи. Есть два традиционных пути решения этой задачи:

• не допускать дублирования записей непосредственно при вводе информации в базу данных;

• находить и устранять повторяющиеся записи из уже сформированной БД.

Напомним, что мы работаем с объединенным информационным банком, в котором собраны разнородные базы данных. Поэтому неудивительно, что для разных БД эта задача решается неодинаковыми средствами. В последующих главах мы покажем, как предотвратить дублирование сведений при вводе информации в базу данных, используя средства языка Visual Basic. А сейчас речь пойдет о том, как удалять повторяющиеся записи с помощью стандартных запросов.

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

Запрос на поиск повторяющихся записей

Начнем с таблицы ES_OPER. В окне базы данных откройте вкладку Запросы и щелкните по кнопке

Затем в окне Новый запрос выберите позицию Повторяющиеся записи (рис. 11.49). Как видите, создаваемый запрос отличается от тех, что рассматривались ранее, – он строится с помощью мастера запросов. Последний содержит три шага, каждый из которых описывается своим окном.

Рис. 11.49

В первом окне (рис. 11.50) мастер просит определить таблицу или запрос, в котором надо найти повторяющиеся поля. Выберите таблицу ES_OPER и продолжите работу.

Рис. 11.50

В следующем окне (см. рис. 11.51) надо указать повторяющиеся поля. Будем считать, что записи дублируют друг друга, если в них совпадает содержимое трех полей: Дата ЧС, Код объекта, Виды ЧС. Иначе говоря, мы исходим из того, что в один и тот же день на данном объекте не могут произойти две или более однотипные аварии. (Конечно, было бы проще поставить условием совпадение всех полей. Однако даже для записей аналогичного содержания это маловероятно: сообщения об одном и том же событии могут передаваться разными людьми и основываться на разных источниках информации. Отсюда неизбежность расхождений и просто ошибок.) Вы уже знаете, как открыть перечисленные поля в окне мастера запросов, поэтому здесь представлен лишь конечный результат.

Рис. 11.51

После этого мастер откроет следующее окно (см. рис. 11.52), предлагая включить в запрос дополнительные поля. Рекомендуем добавить поле Номер для указания номера записи (чуть позже будет объяснена причина). В следующем окне мастер предложит согласиться с именем нового запроса.

Рис. 11.52

Пока советуем согласиться с именем Поиск повторений для ES_OPER.

Запустив этот запрос на выполнение, вы получите выборку в виде таблицы (см. рис. 11.53). Здесь аккумулированы записи, в которых повторяются поля Дата ЧС, Код объекта и Виды ЧС, определенные выше в качестве критериев отбора. Как видите, таких записей всего 382, или 4,87 % от их общего числа – вполне правдоподобная оценка.

Рис. 11.53

Удаление повторяющихся записей

Если следовать формальной логике, при удалении записей нужно использовать запрос на удаление. Можно так и сделать, но это не идеальное решение. Попробуем разобраться.

Когда вы удаляете определенные записи с помощью соответствующего запроса, то должны ввести какие-то условия отбора. Эти критерии могут быть основаны либо на внешних признаках (нужно отобрать значение, которое равно, больше или меньше указанного числа или выражения), либо на определенном соотношении между полями одной записи (заданное соотношение должно соблюдаться во всех отфильтрованных записях). В условиях отбора не заложено сопоставление различных записей, а ведь именно это требуется при поиске дубликатов. Сформулировать критерии отбора так, чтобы они позволяли отследить именно повторяющиеся записи, не удается. Если же вы непременно хотите использовать для уничтожения дубликатов запрос на удаление, попробуйте следующий способ. Задайте в качестве условия удаления номер записи, который указывается в запросе, на поиск повторяющихся записей, как показано на рис. 11.53. (Вот почему поле Номер следует включить в итоговую таблицу повторяющихся записей!) Чтобы реализовать эту идею, в строке Условия отбора бланка запроса на удаление введите выражение типа:

N1 AND N2 AND N3 AND…

где:

• N1 – номер первой записи, которую следует удалить;

• N2 – номер второй записи, которую надо удалить;

• N3 – номер третьей записи на удаление и т. д.

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

Тем не менее можно воспользоваться и другим способом. Мы не утверждаем, что он самый лучший, но в данном случае этот путь действительно проще, чем создание запроса на удаление. Нужно последовательно применить запросы на обновление и добавление записей. Итак, в чем суть нашей идеи?

В таблице ES_OPER создается новое поле – назовите его Условие отбора. Введите в него конкатенацию полей. Конкатенация – это объединение текстуальных, числовых символов или дат в одной ячейке, которое осуществляется с помощью оператора & (амперсанда). В нашем случае следует ввести поля Дата ЧС, Код объекта и Виды ЧС, потому что именно они выше были заданы в качестве критериев отбора дублирующихся записей. При создании этого поля разрешается дублирование записей, поскольку они уже существуют. Затем надо скопировать структуру таблицы ES_OPER (без ее содержания) и в полученной копии в поле Условие отбора установить запрет на дублирование информации. После этого в пустую таблицу следует добавить записи из исходной таблицы ES_OPER. Тем самым повторяющиеся записи исключаются, поскольку их ввод запрещен в поле Условие отбора. Чтобы завершить операцию, удалите исходную таблицу ES_OPER, а ее название присвойте скопированной таблице. Поле Условие отбора можно также удалить, но лучше его все-таки оставить, чтобы предотвратить дублирование записей в дальнейшем.

Мы разработали стратегический план операции. Теперь начнем его реализовывать.

Ввод нового поля

Приступим к формированию и исполнению запроса на обновление. Сначала необходимо создать новое поле Условие отбора с помощью конструктора таблиц. Так как об этом подробно рассказывалось в главе 3, здесь мы приводим лишь результат работы: итоговый вид поля Условие отбора в конструкторе таблиц (см. рис. 11.54).

Рис. 11.54

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

Рис. 11.55

Оставьте сомнения и смело отвечайте Да. В результате вы получите таблицу ES_OPER с новым пустым полем Условие отбора.

Запрос на обновление записей

Теперь сформируйте запрос на обновление, чтобы ввести в созданное поле Условие отбора конкатенацию полей – критериев, по которым идет поиск дублирующихся записей. Как обычно, сначала создайте запрос для таблицы ES_OPER. Чтобы не возиться с лишней информацией, оставьте в запросе только одно поле – Условие отбора. Затем, как и раньше, откройте меню Тип запроса и выберите опцию Запрос на обновление. В строку Обновление внесите конкатенацию: [Дата ЧС] & [Код объекта] & [Виды ЧС] (рис. 11.56).

Рис. 11.56

Обратите внимание, что имена полей необходимо заключить в квадратные скобки, иначе вместо значений полей будут введены их названия. Если вы теперь отправите запрос на выполнение, то в поле Условие отбора будут включены совокупные значения полей, полученные после их объединения. На рис. 11.57, где представлена часть таблицы ES_OPER, показан результат операции.

Рис. 11.57

И снова запрос на добавление

Наконец, завершая работу по удалению повторяющихся записей, скопируйте ES_OPER в новую таблицу, где в поле Условие отбора будет задан запрет на дублирование. Для этого в окне базы данных выделите таблицу ES_OPER и последовательно щелкните по кнопкам

(Копировать) и

(Вставить). В окне Вставка таблицы (рис. 11.58) укажите имя новой таблицы – ES_OPER1.

Рис. 11.58

В этом же окне выберите в разделе Параметры вставки опцию Только структура. Когда вы щелкнете по кнопке ОК, в окне базы данных на вкладке Таблицы появится имя новой таблицы – ES_OPER1. Откройте ее в режиме конструктора и измените то свойство поля Условие отбора, которое касается запрета на повторение записей (рис. 11.59). Сравните значение этого свойства, установленное для скопированной таблицы, с аналогичным значением для исходной таблицы (см. рис. 11.54).

Рис. 11.59

Теперь займемся формированием долгожданного запроса на добавление. Алгоритм создания подобных запросов был подробно рассмотрен в этой главе, в разделе «Запрос на добавление записей в таблицу», поэтому здесь отметим лишь одну деталь. В данном случае таблицей-получателем является ES_OPER1, а таблицей-источником – ES_OPER. В ходе выполнения запроса Access 2002 пожалуется вам на то, что не может включить в таблицу-получатель какое-то количество записей, поскольку в ней не допускается наличие дубликатов (рис. 11.60).

Рис. 11.60

Но именно к этому вы и стремились! Отбросив угрызения совести, смело отвечайте Да.

Итоговый вид бланка запроса показан на рис. 11.61, а очищенная от повторяющихся записей таблица ES_OPER1 – на рис. 11.62.

Рис. 11.61

Рис. 11.62

По поводу последней необходимо небольшое пояснение. Если вы обратитесь к результирующей таблице повторяющихся записей, которая представлена на рис. 11.53, то убедитесь, что она включает 382 дубликата. Между тем исходная таблица ES_OPER содержит 7841 запись, а таблица ES_OPER1 – 7626 записей. Значит, удалено всего 215 записей.

В чем причина такого расхождения? Дело в том, что таблица повторяющихся записей содержит все дубликаты, а при удалении уничтожаются лишь вторые, третьи и т. д. копии. Первый же экземпляр сохраняется, так как после удаления дубликатов он остается единственным. Правда, Access 2002 не утруждает себя размышлениями о том, какой именно вариант записи следует уничтожить; но это уже другой вопрос.

Теперь, чтобы завершить всю операцию, удалите из базы данных таблицу ES_OPER, а ее имя присвойте таблице ES_OPER1 . Что касается поля Условие отбора, то при желании его можно убрать. Однако мы уже рекомендовали вам не торопиться с этим: наличие поля позволит предотвратить дублирование записей при последующем вводе данных.

Если мы теперь посмотрим инструкцию SQL, например для последнего запроса на добавление (рис. 11.63), то увидим, как там, в соответствии с уже рассмотренными выше правилами, «прописаны» действия над всеми полями таблиц.

Рис. 11.63

Данный текст является ознакомительным фрагментом.