- •Часть 2
- •Часть 2
- •Содержание
- •1. Конструктор запросов 4
- •2. Запрос на выборку. 13
- •1. Конструктор запросов
- •Создание выражений с помощью Построителя выражений
- •2. Запрос на выборку.
- •2.1. Запрос, основанный на одной таблице и использующий простое условие
- •2.2. Простая выборка из двух связанных таблиц.
- •2.3. Запрос, использующий вычисляемые поля
- •2.4. Запрос с группировкой
- •2.5. Запрос, использующий связь таблицы с самой собой (рекурсивное соединение)
- •2.6. Запрос, использующий две ссылки на одну таблицу
- •2.7. Выборка повторяющихся записей
- •2.8. Поиск несовпадающих записей
- •2.9. Другие сведения, полезные при разработке запросов
- •3. Запрос на удаление записей.
- •3.1. Запрос на удаление всех записей из таблицы (очистка таблицы)
- •3.2. Запрос на удаление с ограничением числа удаляемых записей
- •3.3. Запрос на удаление с применением внешнего объединения таблиц
- •4. Запрос на добавление записей в существующую таблицу
- •4.1. Запрос на добавление записей во временную таблицу текущей базы данных
- •4.2. Запрос на добавление записей во временную таблицу внешней базы данных
- •5. Запрос на обновление записей в таблице.
- •5.1. Простой запрос на обновление записей
- •5.2. Запрос на обновление полей нескольких связанных таблиц.
- •6. Запросы на объединение.
- •6.1. Запрос на объединение, связывающий воедино однотипные таблицы из различных баз данных.
- •7. Перекрестные запросы
- •7.1. Создание перекрестного запроса при помощи мастера
- •7.2. Сознание перекрестного запроса при помощи конструктора запросов
- •8. Запросы с параметрами
- •9. Подчиненные запросы
- •9.1. Использование подчиненных запросов в выражениях для условий отбора записей
- •9.2. Использование подчиненных запросов в определении полей основного запроса.
- •10. Свойства полей запросов
- •11. Свойства запросов
6. Запросы на объединение.
Запросы на объединение являются специфической разновидностью запросов на выборку и предназначены для объединения нескольких временных наборов данных в один. Конструктивно запросы на объединение представляют собой несколько запросов на выборку, представленных своими SQL-операторами, которые соединены друг с другом ключевым словом UNION. Все запросы на выборку, входящие в запрос на объединение, должны иметь одинаковое число полей (столбцов), при этом имена полей, объединяемых по вертикали, могут и не совпадать. Именами полей итоговой выборки будут имена полей из первого запроса (SQL-оператора). Типы объединяемых полей должны быть совместимыми, за одним исключением — в одном поле могут быть текстовые и числовые типы значений (числовые значения будут преобразованы к текстовому типу).
Типичным примером использования запросов на объединение служит задача построения балансового отчета для склада. Обычно накладные на расход и приход товаров хранятся в разных таблицах. Объединив в одном запросе информацию из обеих таблиц, причем количество и стоимость товаров из накладных на расход должны браться с отрицательным знаком, можно получить баланс по каждому товару за определенный период.
Поскольку запросы на объединение являются так называемыми запросами SQL, то работать с ними можно только в двух режимах — в режиме таблицы и в режиме SQL-оператора. Режим конструктора для них не доступен. Удобно конструировать запросы на объединение следующим образом:
на первом шаге в режиме конструктора создаются все необходимые запросы на выборку (т.е. запросы, результаты работы которых должны быть объединены в одну итоговую выборку);
далее необходимо создать новый запрос и открыть его в режиме SQL-оператора (отказавшись от добавления в макет каких-либо таблиц);
не закрывая этот запрос, нужно поочередно открывать созданные перед этим запросы на выборку в режиме SQL-оператора, копировать соответствующие строки операторов в буфер, а затем вставлять их в запрос на объединение;
на последнем этапе разработки между SQL-операторами запроса на объединение необходимо вставить ключевые слова UNION.
Синтаксис запроса на объединение следующий:
Запрос_на_выборку_1
UNION [ALL]
Запрос_на_выборку_2
UNION [ALL]
...
Запрос_на_выборку_n
Запросы на объединение обычно используются совместно с другими запросами (на выборку, на добавление и т.д.). Схема взаимодействия такова: сначала создается запрос на объединение, возвращающий несколько подряд идущих однотипных временных наборов данных. После этого создается, например, запрос на выборку, в качестве источника данных использующий запрос на объединение. Используя в этом запросе группировку и статистические функции (Sum, Count и другие), можно сформировать необходимый набор данных.
6.1. Запрос на объединение, связывающий воедино однотипные таблицы из различных баз данных.
Допустим, что с базой данных Борей, точнее с двумя ее копиями, работают два оператора, компьютеры которых достаточно удалены друг от друга и не связаны между собой сетью. Такая ситуация встречается довольно часто. Операторы работают независимо друг от друга, заполняя каждый свою копию базы данных своими сведениями. Для того чтобы объединить информацию, внесенную обоими операторами, в один набор данных для последующего анализа, очень удобно использовать запрос на объединение.
Прежде чем начать конструировать нужный запрос, следует предпринять несколько предварительных шагов:
Скопировать базу данных Борей под другим именем в том же каталоге, например Борей1
Открыть базу данных Борей1 и удалить несколько записей из таблицы Заказы.
На первом шаге нужно сконструировать и отладить запросы на выборку, которые потом лягут в основу запроса на объединение. Один запрос выбирает записи из текущей базы данных Борей, второй – из базы данных Борей1.
Теперь необходимо сконструировать два запроса на выборку – один выбирает записи на выборку из текущей базы данных (Борей), второй – из базы данных Борей1.
Создайте новый запрос и откройте его в режиме конструктора. Добавьте к нему таблицу Заказы и перетащите из нее в бланк запроса строчку с изображением звездочки (*). Звездочка в бланке запросов означает, что выбираться будут все поля из таблицы. Закройте запрос, сохранив его под каким-либо именем (например, под именем 1).
Создайте еще один запрос и откройте его в режиме конструктора, не добавляя в него никаких таблиц. В окне свойств запроса укажите в свойстве База данных-источник полный путь и имя базы Борей1, например, D:\Мои документы\Борей1.mdb. После этого добавьте в запрос таблицу Заказы и перетащите из нее в бланк запроса звездочку (*). Сохраните этот запрос, например, под именем 2 и закройте его.
Открывая поочередно запросы 1 и 2 в режиме таблицы, можно убедиться, что записи действительно отбираются из разных файлов баз данных. В нашем случае запрос 1 возвращал 830 записей (из базы Борей), а запрос 2 – 800 записей (в таблице Заказы базы данных Борей1 было удалено 30 записей).
Создаем запрос на объединение. Откройте новый запрос в режиме конструктора, отказавшись от добавления в него таблиц, и переключитесь в режим SQL. Не закрывая этот запрос, откройте в режиме SQL запросы 1 и 2. Скопируйте в буфер обмена SQL-оператор из запроса 1 и вставьте его в запрос на объединение. Удалите точку с запятой в конце SQL-строки и добавьте ключевые слова UNION ALL. Таким же образом вставьте из буфера SQL-оператор из запроса 2. Сохраните сконструированный запрос и закройте его. При сохранении запроса Microsoft Access автоматически распознает его тип, преобразовав в запрос на объединение. Запрос изображен на рис. 6.1.
Рис. 6.1. Запрос на объединение, связывающий однотипные таблицы из различных баз данных
Для реального использования результатов запроса на объединение, нужно сконструировать запрос на выборку, группирующий информацию. Создайте новый запрос и откройте его в режиме конструктора. Добавьте в его макет обсуждавшийся выше запрос на объединение. Перетащите все поля в бланк запроса и нажмите кнопку Групповые операции (кнопка панели инструментов с изображением ∑). Звездочку в этом случае использовать нельзя, поскольку в запросе нужно четко перечислить поля, подлежащие группировке. Запрос, использующий результаты запроса на объединение, изображен на рис. 6.2.
|
|
Рис. 6.2. Запрос, группирующий результаты выполнения запроса на объединение.
Пояснения
а). Создать новый пустой запрос на объединение можно и другим способом. Для этого создайте новый запрос и откройте его в режиме конструктора, отказавшись от добавления таблиц. Затем из контекстного меню запроса выберите пункт Запрос SQL | Объединение. Новый запрос на объединение будет открыт в режиме SQL-оператора.
б). Инструкции SQL. В запросе на выборку данных из внешнего файла базы данных Бopeй в операторе FROM используется предложение IN. В этом контексте конструкция IN используется для указания полного пути и названия файла внешней базы данных, расположенного на локальном или сетевом диске. Путь и имя файла берутся в одинарные кавычки.
в). В запросе, использовалась группировка для всех без исключения полей, включенных в запрос. Обычно такой подход не имеет смысла: помимо группировки почти всегда используются агрегатные (статистические) функции Sum, Count, Avg и т.д. Задание группировки для всех полей запроса приводит к выборке неповторяющихся записей из временного набора данных, то есть, из уже отобранных. По сути, в результирующем наборе данных будут представлены записи, входящие хотя бы в одну из таблиц обеих баз данных (текущей и внешней). В некотором смысле группировка всех полей запроса аналогична использованию ключевого слова (предиката) DISTINCT в операторе SELECT (или установке в значение Да свойства запроса Уникальные значения.
