Простые вложенные подзапросы 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Простые вложенные подзапросы



Простые вложенные подзапросы используются для представления множества значений, исследование которых должно осуществляться в каком-либо предикате IN, например:

SELECT *

FROM “Поставщики”

WHERE “Код_поставщика” IN

(SELECT DISTINCT “Код_поставщика”

FROM “Книги”

WHERE “Автор” LIKE ‘%Дейт%’)

Система выполняет прежде всего вложенный подзапрос. Этот подзапрос выдает множество уникальных кодов поставщиков, которые поставили книги указанного автора. Затем будет выполнен внешний запрос, который выведет данные об этих поставщиках.

Тот же результат можно получить с помощью соединения:

SELECT ”Поставщики”.*

FROM “Книги”, “Поставщики”

WHERE “Книги”.”Код_поставщика” = “Поставщики”.“Код_поставщика”

AND “Автор” LIKE ‘%Дейт%’

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

В подобных запросах можно использовать не только оператор IN, но и операторы сравнения (<>, <=, <, >= или >), однако, если вложенный подзапрос возвращает более одного значения и не используется оператор IN, будет возникать ошибка.

Коррелированные вложенные подзапросы

Рассмотрим запрос:

SELECT *

FROM “Заказы”

WHERE ‘Некто’ IN

(SELECT ”Имя”

FROM “Заказчики”

WHERE “Код_заказчика” = “Заказы”.”Код_заказчика”);

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

Система проверяет первую строку таблицы Заказы. Предположим, что в этой строке Код_заказчика имеет значение 1. Тогда значение Заказы.Код_заказчика в данный момент также примет значение 1 и система cможет обработать внутренний запрос

(SELECT Имя

FROM Заказчики

WHERE Код_заказчика = 1)

получив в результате некоторое подмножество значений поля Имя. Выборка значений для этого заказчика будет проведена тогда и только тогда, когда значение ‘Некто’ будет принадлежать этому множеству. На этом завершается обработка для заказчика с кодом 1.

Далее выбирается вторая строка таблицы Заказы и выполняется аналогичная обработка для следующего заказчика и т.д. до тех пор, пока не будут рассмотрены все строки таблицы Заказы.

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

Следующий пример демонстрирует использование одной и той же таблицы во внешнем подзапросе и коррелированном вложенном подзапросе:

SELECT "Код_книги", "Автор", "Название", "Издательство"

FROM "Книги" A

WHERE "Название" IN

(SELECT DISTINCT "Название"

FROM "Книги" B

WHERE A."Издательство"!= B."Издательство")

ORDER BY "Автор"

В этом запросе поочередно для каждой строки таблицы Книги выбирается значение поля Издательство и для этого значения выполняется вложенный подзапрос, результатом которого является список уникальных названий книг, изданных другими издательствами. Текущая строка таблицы Книги включается в результат запроса, если значение в поле Название входит в список, сформированный вложенным запросом. Т.о., будут выданы данные о книгах, изданных более чем в одном издательстве, и результирующий список будет отсортирован по полю Автор.



Поделиться:


Последнее изменение этой страницы: 2017-01-25; просмотров: 138; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.221.239.148 (0.005 с.)