- •Часть 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. Свойства запросов
9. Подчиненные запросы
Подчиненным запросом (запросом в запросе) называется инструкция SQL SELECT, расположенная внутри другого запроса на выборку или запроса на изменение. Допускается использование подчиненных запросов в выражениях, введенных в ячейку поля (столбца) в режиме конструктора запросов, или при определении условия отбора для поля. Результат внедренной инструкции SELECT становится частью условий отбора либо частью определения поля в главном запросе. Например, в следующем запросе с помощью подчиненного запроса отбираются все поставщики из России, а затем результаты используются в предложении WHERE для поиска всех товаров для каждого из выбранных поставщиков:
WHERE Код Поставника
IN (SELECT КодПоставщика
FROM Поставники
WHERE (Страна = "Россия"))
Использование подчиненных запросов значительно замедляет работу основного запроса и, кроме того, ведет к неоправданному увеличению файла базы данных, поэтому применение их крайне нежелательно. Зачастую подчиненные запросы можно заменить правильно организованными связями между таблицами.
Ниже приведено несколько примеров использования подчиненных запросов.
9.1. Использование подчиненных запросов в выражениях для условий отбора записей
Допустим, необходимо выбрать заказы, размещенные в 1998 году и имеющие стоимость выше средней за 1998 год. Создайте новый запрос, откройте его в режиме конструктора и добавьте в его макет таблицы Заказы и Заказано. В бланк запроса перетащите поля КодЗаказа, Код Клиента и Дата Размещения из таблицы Заказы. В определение следующего поля введите строку:
Сумма: ССиr([Заказано].[Цена] *[Количество]*(1-[Скидка])/100)*100
Для поля ДатаРазмещения задайте условие отбора: Between #01.01.98# And #31.12.98#, а для поля Сумма задайте порядок сортировки по убыванию и в графе Условие отбора введите строку:
>(SELECT Avg(CCur([3aкaзaнo].[Цeнa]*[Количecmвo]*(1-[Cкuдкa])/100)*100) AS Сумма FROM Заказы INNER JOIN Заказано ON Заказы.КодЗаказа = Заказано.КодЗаказа WHERE (((Заказы.ДатаРазмещения) Between #1/1/1998# And #12/31/1998#)))
Полученный запрос изображен на рис. 9.1.
|
|
Рис. 9.1. Запрос, использующий подчиненный запрос в выражении для условия отбора записей.
Пояснения
а). Удобнее сначала создать и отладить запрос, который должен быть подчиненным, а затем скопировать строку SQL-оператора в главный (основной) запрос.
б). В данной ситуации подчиненный запрос должен возвращать только одно значение, в противном случае Microsoft Access выдаст сообщение об ошибке и основной запрос работать не будет.
в). Описанный выше запрос работает следующим образом — вначале выполняется подчиненный запрос, возвращающий значение средней стоимости всех заказов, размещенных в 1998 году, а затем это значение используется в условии отбора для ограничения возвращаемых основным запросом записей.
г). В этом примере использование подчиненного запроса неизбежно. Заменить его какой-нибудь другой конструкцией без излишнего усложнения не удастся.
д). Строка SQL-оператора подчиненного запроса не содержит точку с запятой и с обе их сторон обязательно заключается в круглые скобки.
е). Обратите внимание, что после повторного открытия запроса в режиме конструктора в бланке запроса будет содержаться копия поля Сумма, для которой и задано условие, использующее подчиненный запрос.
