Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Access часть2.doc
Скачиваний:
24
Добавлен:
14.08.2019
Размер:
6.24 Mб
Скачать

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-оператора подчиненного запроса не содержит точку с запятой и с обе их сторон обязательно заключается в круглые скобки.

е). Обратите внимание, что после повторного открытия запроса в режиме конструктора в бланке запроса будет содержаться копия поля Сумма, для которой и задано условие, использующее подчиненный запрос.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]