Отбор повторяющихся записей и записей без подчиненных

Типичной операцией, которую приходится выполнять в базе данных, является поиск дубликатов, т. е. повторяющихся записей в таблице. Например, можно выяснить, не встречается ли в таблице "Клиенты" (Customers) одна и та же фирма несколько раз. При этом необходимо сначала определить, какие записи считать дубликатами. В данном случае дубликатами мы будем считать организации с одинаковыми названиями и адресами. Можно создать запрос, который найдет все такие записи. Для этого проще всего воспользоваться соответствующим мастером:

  1. Раскройте список запросов в окне базы данных и нажмите кнопку Создать (New). В диалоговом окне Новый запрос (New Query) выберите из списка элемент Повторяющиеся записи (Find Duplicates Query Wizard). Появится диалоговое окно мастера поиска повторяющихся записей (рис. 8.27).
  2. Выберите из списка таблицу "Клиенты" (Customers) (по умолчанию в окне отображается именно список таблиц, но можно установить флажок и получить список запросов или таблиц и запросов вместе).
  3. Следуйте указаниям мастера (они подробно описаны в диалоговых окнах), и в результате вы получите запрос, который в режиме Конструктора может выглядеть так, как представлено на рис. 8.28.

Диалоговое окно Мастера поиска повторяющихся записей

Рис. 8.27. Диалоговое окно Мастера поиска повторяющихся записей

Запрос, отбирающий повторяющиеся записи в таблице "Клиенты"

Рис. 8.28. Запрос, отбирающий повторяющиеся записи в таблице "Клиенты"

  1. Данный запрос имеет сложное выражение в строке Условие отбора (Criteria) поля "Название":

    In (SELECT [Название] FROM [Клиенты] As Tmp GROUP BY [Название],[Адрес] HAVING Count(*)>l And [Адрес] = [Клиенты].[Адрес])

    Это выражение включает еще один запрос. Такой запрос называется подчиненным запросом (подробнее о подчиненных запросах см. разд. "Создание подчиненных запросов" в конце данной главы). Чтобы посмотреть, как полностью выглядит инструкция SQL, соответствующая этому запросу, нужно перейти в режим SQL.

Совет

Мы рекомендуем при работе с запросами в режиме Конструктора чаще открывать окно Режим SQL (SQL View). Изучая, как Access создает инструкции SQL, можно постепенно выучить этот язык. Правда, помните, что в данном случае мы имеем дело с диалектом стандартного языка SQL — Access SQL. Ниже мы расскажем, чем он отличается от стандартного языка SQL (см. разд. "Сравнение ANSI и Jet SQL" данной главы).

Такой поиск разумно выполнять также в таблицах, которые экспортированы из другой среды, например Excel. Эти таблицы могут содержать дублирующие записи, которые нужно найти и удалить. Для удаления дубликатов можно воспользоваться процедурой, которая описана в справке Access в разделе Работа с запросами, Работа с запросами на изменение, Удаление повторяющихся записей из таблицы.

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

Чтобы создать запрос, который покажет всех клиентов, которые не имеют заказов:

  1. Раскройте список запросов в окне базы данных и нажмите кнопку Создать (New). В диалоговом окне Новый запрос (New Query) выберите из списка элемент Записи без подчиненных (Find Unmatched Query Wizard). Появится диалоговое окно Поиск записей, не имеющих подчиненных (Find Unmatched Query Wizard), аналогичное окну Поиск повторяющихся записей (см. рис. 8.27).
  2. Выберите из списка таблицу "Клиенты" (Customers).
  3. Следуйте указаниям мастера, в результате чего вы получите запрос, который в режиме Конструктора может выглядеть так, как представлено на рис. 8.29.

В бланке запроса в столбце "КодКлиента" задано условие — Is Null. Это означает, что выбираются все клиенты, код которых отсутствует в таблице "Заказы" (Orders). Вы можете использовать это условие всякий раз, когда нужно отыскать записи, у которых одно из полей пусто.

Запрос для поиска записей, не имеющих подчиненных записей

Рис. 8.29. Запрос для поиска записей, не имеющих подчиненных записей