Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Связанные вложенные запросы




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

В этом запросе было бы неразумно выполнять вложенный запрос пять раз (один раз для каждого офиса). Усредненный план не изменяется; т абсолютно не зависит от проверяемого в настоящий момент офиса. Следовательно, вложенный запрос можно выполнить только один раз и, получить усредненный план ($550000), преобразовать главный запрос к виду:

В коммерческих СУБД это упрощение используется всякий раз, когда есть такая возможность, чтобы уменьшить объем работы, необходимой для выполнения запроса. Но когда вложенный запрос содержит внешнюю ссылку, данное упрощение применять нельзя, как показано на следующем примере:

В разных строках таблицы offices, проверяемой предложением where главного запроса, столбец office (который является внешней ссылкой во вложенном запросе) имеет различные значения. Поэтому вложенный запрос должен выполняться пять раз — один раз для каждой строки таблицы offices. Вложенный запрос, содержащий внешнюю ссылку, называется связанным вложенным запросом, так как его результаты связаны с отдельной строкой таблицы в главном запросе. По той же самой причине внешняя ссылка называется иногда связанной ссылкой.

Вложенный запрос может иметь внешнюю ссылку на таблицу в предложении from любого запроса, который содержит данный вложенный запрос, независимо от его уровня вложенности. Например, имя столбца во вложенном запросе четвертого уровня может относиться к одной из таблиц, указанных в предложении from главного запроса, или к таблице в любом вложенном запросе, содержащем данный вложенный запрос четвертого уровня. Независимо от уровня вложенности внешняя ссылка всегда принимает значение столбца в "текущей" строке проверяемой таблицы.

Так как вложенный запрос может содержать внешние ссылки, вероятность неоднозначных ссылок на имена столбцов во вложенном запросе еще выше, чем в главном запросе. Если во вложенном запросе присутствует неполное имя столбца, SQL должен определить, относится ли оно к таблице предложения from самого вложенного запроса или к предложению from запроса, содержащего вложенный запрос. Чтобы минимизировать возможность путаницы, в SQL всегда предполагается, что ссылка на столбец во вложенном запросе относится к ближайшему возможному предложению from. Для иллюстрации приведем пример, где та же самая таблица используется и в главном, и во вложенном запросах:

Столбцы MANAGER, QUOTA и SALES во вложенном запросе являются ссылками на таблицу salesreps в предложении from самого вложенного запроса; SQL не интерпретирует их как внешние ссылки, и вложенный запрос не является связанным вложенным запросом. Как уже говорилось ранее, SQL в данном случае может сначала выполнить вложенный запрос: найти служащих, опережающих план, и составить список, содержащий идентификаторы их руководителей. Затем SQL может приступить к выполнению главного запроса и отобрать руководителей из полученного списка.

Если вы хотите создать внешнюю ссылку во вложенном запросе, аналогичном рассмотренному в предыдущем примере, то для этого должны использовать псевдонимы таблицы. Как это делается, показано на примере запроса, в который по сравнению с предыдущим добавлено еще одно условие:

Теперь копия таблицы salesreps в главном запросе имеет метку mgrs, а копия во вложенном запросе —• метку emps. Вложенный запрос содержит одно дополнительное условие поиска, требующее, чтобы идентификатор офиса служащего не был равен идентификатору офиса руководителя. Полное имя столбца mgrs. office во вложенном запросе — это внешняя ссылка, и данный вложенный запрос является связанным.

ВЛОЖЕННЫЕ ЗАПРОСЫ В ПРЕДЛОЖЕНИИ HAVING

Хотя вложенные запросы чаще всего применяются в предложении where, их можно использовать и в предложении having главного запроса: Когда вложенный запрос содержится в предложении having, он участвует в отборе группы строк.

Вложенный запрос вычисляет среднюю стоимость по всем заказам. Это простой вложенный запрос, не содержащий внешних ссылок, поэтому искомая средняя стоимость вычисляется один раз, а затем многократно используется в предложении having. Главный запрос просматривает строки таблицы orders, отыскивая все заказы на товары компании ACI, и группирует их по именам служащих. Затем предложение having сравнивает среднюю стоимость по каждой группе заказов со средней стоимостью по всем заказам, вычисленной ранее. Если средняя стоимость по труппе больше, чем общая средняя стоимость, то данная группа строк сохраняется; если нет, то группа строк исключается. И, наконец, предложение select создает для каждой группы итоговую строку, содержащую имя служащего и среднюю стоимость принятых им заказов.

В предложении having можно также использовать связанный вложенный запрос. Однако поскольку вложенный запрос выполняется один раз для каждой группы строк, все внешние ссылки в связанном вложенном запросе должны иметь одно значение для каждой группы строк. На практике это означает, что внешняя ссылка должна либо быть ссылкой на столбец группировки внешнего запроса, либо находиться внутри агрегатной функции. В предложении having можно также использовать связанный вложенный запрос. Все внешние ссылки в самом вложенном запросе должны иметь одно значение для каждой группы строк. На практике это означает, что внешняя ссылка должна либо быть ссылкой на столбец группировки внешнего запроса, либо находиться внутри агрегатной функции. В последнем случае значение агрегатной функции для проверяемой группы строк вычисляется в ходе выполнения вложенного запроса.

 




Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 345; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.007 сек.