ВЛОЖЕННЫЕ ЗАПРОСЫ И ОБЪЕДИНЕНИЯ

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

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

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

Каждый из двух приведенных запросов находит соответствующих служащих, и ни один из них не является ни "правильным", ни "ошибочным". Для большинства людей первый вариант (с использованием вложенного запроса) покажется более естественным, так как в словесном запросе не требуется никакой информации об офисах, и объединение таблиц salesreps и offices для ответа на запрос кажется немного странным. Конечно, если запрос изменить так, чтобы в нем запрашивалась информация из таблицы offices, то вариант с вложенным запросом больше не годится и необходимо использовать запрос к двум таблицам:

С другой стороны, имеется много запросов с вложенными запросами, которые нельзя выразить в виде эквивалентного объединения. Вот простой пример:

В данном случае внутренний запрос является итоговым, а внешний — нет, поэтому из этих двух запросов нельзя сделать объединение.

Уровни вложенности запросов___

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

возвращает столбец данных, содержащий идентификаторы офисов восточного региона. Следующий вложенный запрос

возвращает столбец данных, содержащий идентификаторы служащих, рабо тающих в одном из выбранных офисов. И наконец, внешний запрос

находит клиентов, закрепленных за выбранными служащими.

По такой же методике можно создавать запросы с четырьмя и более уровнями вложенности. Стандарт ANSI/ISO не определяет максимально число уровней вложенности. Но на практике с ростом их числа очень быстро увеличивается время выполнения запроса. Когда запрос имеет более двух уровней вложенности, он становится трудным для чтения и понимания. Во многих СУБД количество уровней вложенности запросов ограничено относительно небольшим числом.