Создайте запрос на выборку из таблицы Fiie1 и укажите в нем условия отбора записей. По структуре эта таблица отличается от таблицы ES_OPER. В частности, основная текстовая информация таблицы Fiie1 содержится в поле Характеристика ЧС. Поэтому условия отбора данных в запросе, который вы создаете, будут отличаться от критериев, введенных для таблицы ES_OPER. Поскольку необходимо отфильтровать записи об авариях на нефтепроводах Тюменской области, в запросе на выборку введите в поле Регион выражение *Тюменск*, а в поле Характеристика ЧС — Нефтепровод* (неизменяемые части слов – с учетом того, что говорилось выше о возможности употребления слова в разных падежах). Сформированный запрос показан на рис. 11.40.
Рис. 11.40
С помощью кнопки
выполним этот запрос и получим выборку из таблицы Fiie1, содержащую две записи. Она включает 5 полей, интересующих нас в этой таблице (рис. 11.41).
Рис. 11.41
Таким образом, наша задача состоит в том, чтобы объединить в одной таблице записи из таблиц на рис. 11.37 и 11.41, имеющих разную структуру. Напомним, что состав полей в этих таблицах отобран нами из всего множества содержащихся в них полей.
Теперь надо выполнить запрос на создание таблицы. Мы выполнили его немного раньше, в результате чего имеем таблицу Выборка1.
Задайте тип запроса. Пусть это будет запрос на добавление. На экране вновь появится окно Добавить. В нем следует выбрать опцию Присвоить имя таблице. Так как вы уже вводили ее имя на предыдущем этапе, просто щелкните по стрелке прокрутки и в открывшемся списке укажите позицию Выборка1 (рис. 11.42).
Рис. 11.42
Затем щелкните по кнопке ОК, и на экране возникнет окно Запрос на добавление (рис. 11.43). Перед тем как дать команду на его выполнение, обязательно укажите, в какое поле таблицы-получателя Выборка1 надо поместить данные из соответствующего столбца таблицы ES_OPER.
Рис. 11.43
Как вы помните, эти две таблицы различны по структуре, а также по набору и формату полей. Поэтому соответствие полей обеих таблиц определяет пользователь индивидуально для каждой ситуации. В данном случае – согласно табл. 11.1, где в левом столбце представлены поля, которые мы хотим включить в итоговую объединенную таблицу, а в правом – те столбцы из таблицы ES_OPER, которые должны «поставлять» информацию в объединенную таблицу. Таблица 11.1
Поля, не имеющие аналогов в правом столбце табл. 11.1, следует ввести в таблицу Выборка1 вручную (если они изначально в этой таблице отсутствуют – в нашем случае – поле Текст сообщения). Это знакомая нам корректировка структуры таблицы с помощью конструктора таблиц показана на рис. 11.44. Если поле в столбце таблицы Выборка1 имеет аналог в правом столбце, это означает, что информация из данного поля в таблице ES_OPER включается в соответствующее поле таблицы Выборка1.
Рис. 11.44
С учетом всего сказанного правила построения запроса на добавление (на примере рис. 11.43) таковы:
• базовой таблицей для запроса на добавление является дополнительная (в отличие от основной, на которой построена таблица Выборка1 . В данном случае такой дополнительной таблицей является ES_OPER, а основной – File1;
• в качестве полей в запрос включаются только те дополнительные поля, которых не хватает в таблице Выборка1 для формирования в ней объединенной информации. В данном случае – поля Дата ЧС, Виды ЧС, Текст сообщения, Населенный пункт;
• в графе запроса Добавление указываются те поля в таблице Выборка1 , куда заносится информация из отобранных полей дополнительной таблицы (ES_OPER).
Теперь, когда введены все необходимые поля и готовый запрос на добавление (рис. 11.43), осталось только щелкнуть по кнопке
В результате выполнения запроса на экране появится предупреждение о том, что в таблицу Выборка! будет включено еще 11 отобранных записей (рис. 11.45) в дополнение к тем двум записям, которые были получены на первом шаге из таблицы Fiie1 (см. рис. 11.41).
Рис. 11.45
Итоговая таблица с объединенной информацией показана на рис. 11.46.
Рис. 11.46
Итак, вы убедились, что Access 2002 позволяет объединять сведения из таблиц с разной структурой записей. Это очень важно в практической работе.
Запрос на удаление записей
Базы данных не только используются по прямому назначению; часто возникает необходимость произвести в них некоторые вспомогательные, служебные операции. Например, время от времени базу данных надо чистить: там обнаруживаются дублирующиеся записи, устаревшая, бесполезная информация и т. д.
В принципе можно удалить запись из БД и без помощи запроса, а непосредственно из формы, как описывалось в главе 4. Кроме того, можно просто открыть таблицу и удалить выбранную запись. Однако суть проблемы именно в этом слове – «выбранная». Когда число записей в таблице растет и их счет идет на тысячи, определение «жертвы» превращается в сложное и трудоемкое мероприятие. Использование запроса на выборку помогает решить такую задачу.
В окне конструктора создайте обычный запрос на выборку (см. рис. 11.4). Затем с помощью уже хорошо известной вам кнопки
откройте меню Тип запроса и активизируйте в нем опцию Запрос на удаление. Теперь надо ввести в запрос критерии отбора записей для последующего удаления. Здесь требуется уточнить, какие именно записи должны быть уничтожены.
Так как речь идет о базе данных по ЧС, то в ней не предусмотрено накопление и хранение информации о дорожно-транспортных происшествиях – подобные сведения должны содержаться в другом банке данных. Однако по разным причинам в нашу базу данных (в частности, в таблицу ES_OPER) такая информация иногда попадает. Пользы от этого все равно нет, потому что случайные разрозненные записи не дают полной картины по дорожно-транспортным происшествиям. Естественно, такие сведения следует удалять. В бланке запроса в ячейке Условия отбора для поля Код вида ЧС введите код данного типа происшествий – «10101» (рис. 11.47).
Рис. 11.47
Дайте команду на выполнение запроса. На экране появится сообщение о том, что удалению подлежит 556 записей (см. рис. 11.48), и предупреждение, что если вы ответите Да, то назад возврата не будет. Надеемся, что вы исполнены самых серьезных намерений и решительно ответите Да, приведя приговор в исполнение. Таким образом, вы реализуете запрос на удаление, убрав 556 записей, или 6,6 % от общего числа записей в таблице ES_OPER (8397).
Рис. 11.48
Удаление дублирующихся записей
При ведении банка данных довольно часто приходится удалять повторяющиеся записи. Есть два традиционных пути решения этой задачи:
• не допускать дублирования записей непосредственно при вводе информации в базу данных;
• находить и устранять повторяющиеся записи из уже сформированной БД.
Напомним, что мы работаем с объединенным информационным банком, в котором собраны разнородные базы данных. Поэтому неудивительно, что для разных БД эта задача решается неодинаковыми средствами. В последующих главах мы покажем, как предотвратить дублирование сведений при вводе информации в базу данных, используя средства языка Visual Basic. А сейчас речь пойдет о том, как удалять повторяющиеся записи с помощью стандартных запросов.
Когда информация вводится в оперативном режиме из различных источников, в базу данных тоже могут попасть сведения, дублирующие друг друга. Прежде чем удалить такие записи, их надо найти. Следовательно, решение проблемы включает два этапа – поиск повторяющихся записей и их удаление.
Запрос на поиск повторяющихся записей
Начнем с таблицы ES_OPER. В окне базы данных откройте вкладку Запросы и щелкните по кнопке
Затем в окне Новый запрос выберите позицию Повторяющиеся записи (рис. 11.49). Как видите, создаваемый запрос отличается от тех, что рассматривались ранее, – он строится с помощью мастера запросов. Последний содержит три шага, каждый из которых описывается своим окном.
Рис. 11.49
В первом окне (рис. 11.50) мастер просит определить таблицу или запрос, в котором надо найти повторяющиеся поля. Выберите таблицу ES_OPER и продолжите работу.
Рис. 11.50
В следующем окне (см. рис. 11.51) надо указать повторяющиеся поля. Будем считать, что записи дублируют друг друга, если в них совпадает содержимое трех полей: Дата ЧС, Код объекта, Виды ЧС. Иначе говоря, мы исходим из того, что в один и тот же день на данном объекте не могут произойти две или более однотипные аварии. (Конечно, было бы проще поставить условием совпадение всех полей. Однако даже для записей аналогичного содержания это маловероятно: сообщения об одном и том же событии могут передаваться разными людьми и основываться на разных источниках информации. Отсюда неизбежность расхождений и просто ошибок.) Вы уже знаете, как открыть перечисленные поля в окне мастера запросов, поэтому здесь представлен лишь конечный результат.