Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
nwpi233.pdf
Скачиваний:
90
Добавлен:
13.08.2013
Размер:
1.75 Mб
Скачать

WHERE P.Ид_Сотр = К.Ид_Сотр

AND К.Точка = "Мурманск";

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

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

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

SELECT Фамилия

FROM Сотрудник P WHERE “Мурманск” IN

( SELECT Точка

FROM Командировки K

WHERE K.Ид_Сотр = P.Ид_Сотр );

внутренний запрос будет выполняться столько раз, сколько строк находится во внешней таблице СОТРУДНИК (рис. 2.1), а строк в ней 14.

Рассмотрим более детально, каким образом осуществляется обработка запроса. Внешний запрос отыскивает первую фамилию в таблице СОТРУДНИК, например, как у нас в таблице Иванов. Далее система передает

управление вложенному подзапросу, для которого в качестве параметров передается значение переменной - это P.Ид_Сотр. Теперь внутренний запрос на основании этих данных ищет в таблице КОМАНДИРОКИ записи, соответствующие указанному условию. Таких записей две.

После этого внутренний запрос возвращает результат в приложение IN внешнего запроса, где значения столбца Точка из промежуточной таблицы результата (рис. 5.18) вложенного запроса сравниваются со строкой "Мурманск".

N

Ид_Сотр

Точка

строки

 

 

базовой

 

 

таблицы

 

 

 

 

 

1

1

Мурманск

4

1

Петрозаводск

Рис. 5.18. Промежуточный результат

И только те строки промежуточной таблицы (рис. 5.18) попадают в результирующую таблицу запроса, которые в столбце Точка имеют значение равное "Мурманск". Затем снова начинает работать внешний запрос, переходя на строку 2 базовой таблицы СОТРУДНИК (рис. 2.1), тем самым определяя новый Ид_Сотр, который будет передан во вложенный подзапрос.

Результатом работы подзапроса будет (рис. 5.19) одна строка базовой таблицы КОМАНДИРОВКИ (рис. 2.5).

N

Ид_Сотр

Точка

строки

 

 

базовой

 

 

таблицы

 

 

 

 

 

2

2

Мурманск

 

 

 

Рис. 5.19. 1-я строка ответа

Эта строка попадет, подвергаясь обработке внешним запросом, в ответ. Переход в базовой таблице СОТРУДНИК на третью строку передаст во внутренний подзапрос новый идентификатор сотрудника Ид_Сотр=3. Внутренний подзапрос выдаст ответ {Петрозаводск} (рис. 5.20).

N

Ид_Сотр

Точка

строки

 

 

базовой

 

 

таблицы

 

 

 

 

 

3

3

Петрозаводск

Рис. 5.20. Строка не попадает в ответ

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

Таким образом, внешний запрос пробегает все строки базовой таблицы СОТРУДНИК, передавая идентификаторы сотрудников во внутренний запрос, на основании которых создается промежуточная таблица, которая в свою очередь подвергается обработке со стороны внешнего запроса.

Такой подзапрос отличается от простого вложенного подзапроса тем, что вложенный подзапрос не может быть обработан прежде, чем будет обрабатываться внешний подзапрос. Это связано с тем, что вложенный подзапрос зависит от значения Сотрудник.Ид_Сотр. Это значение изменяется по мере того, как система проверяет различные строки таблицы СОТРУДНИК (рис. 2.1).

Одна таблица во внешнем и внутреннем подзапросе

Рассмотрим пример использования одной и той же таблицы во внешнем подзапросе и коррелированном вложенном подзапросе: "Показать номера работ для всех видов работ, выполняемых только одним сотрудником".

Заметим, что для реализации подобных запросов необходимо использовать алиасы (псевдонимы).

SELECT DISTINCT

Раб1.Ид_Вида

FROM

Работы Раб1

WHERE Раб1.Ид_Вида NOT IN

(

SELECT

Раб2.Ид_Вида

 

FROM

РаботыРаб2

 

WHERE

Раб2.Ид_Сотр <> Раб1.Ид_Сотр);

Соседние файлы в предмете Информационные технологии