Учебное пособие Санкт-Петербург «бхв-петербург»



Pdf көрінісі
бет140/256
Дата18.11.2022
өлшемі1.88 Mb.
#465124
түріУчебное пособие
1   ...   136   137   138   139   140   141   142   143   ...   256
sql osnovi yazika

SELECT DISTINCT a.city
FROM airports a
WHERE NOT EXISTS (
SELECT * FROM routes r
WHERE r.departure_city = 'Москва'
AND r.arrival_city = a.city
)
AND a.city <> 'Москва'
ORDER BY city;
В этом запросе мы не можем ограничиться только лишь материализованным пред-
ставлением «Маршруты» (routes), поскольку в нем представлены лишь существу-
ющие
маршруты. Полный список городов можно найти в таблице «Аэропорты»
(airports). Для каждой строки (каждого города) из таблицы airports выполняется
поиск строки в представлении routes, в которой значение атрибута arrival_city
такое же, как в текущей строке таблицы airports. Если такой строки не найдено,
значит, в этот город маршрута из Москвы нет.
Поскольку от подзапроса в предикате EXISTS требуется только установить факт на-
личия или отсутствия строк, соответствующих критерию отбора, то в документации
рекомендуется вместо списка столбцов (или символа «∗») в предложении SELECT де-
лать так:
WHERE NOT EXISTS ( SELECT 1 FROM routes r ...
Обратите внимание на ключевое слово DISTINCT в запросе. Оно необходимо, т. к.
кроме Москвы могут быть другие города, в которых есть более одного аэропорта.
Один такой город уже существует — Ульяновск. Если не использовать DISTINCT, то
в принципе возможно появление строк-дубликатов в выборке.
И еще одна важная деталь. В представленном запросе мы использовали так называ-
емый коррелированный (связанный) подзапрос. В подзапросах такого типа при-
сутствует ссылка (ссылки) на таблицу из внешнего запроса, как здесь:
WHERE ...
AND r.arrival_city = a.city
179


Глава 6. Запросы
В теории это означает, что подзапрос выполняется не один раз для всего внешне-
го запроса, а для каждой строки, обрабатываемой во внешнем запросе. Однако на
практике важную роль играет умение планировщика (это специальная подсистема
в СУБД) оптимизировать подобные запросы с тем, чтобы по возможности избегать
выполнения подзапроса для каждой строки из внешнего запроса.
Получаем такой результат:
city
----------------------
Благовещенск
Иваново
...
Якутск
Ярославль
(20 строк)
Рассмотрим использование подзапросов в предложениях SELECT, FROM и HAVING.
Предположим, что для выработки ценовой политики авиакомпании необходимо
знать, как распределяются места разных классов в самолетах всех типов. Первый ва-
риант решения этой задачи основан на включении подзапросов в предложение


Достарыңызбен бөлісу:
1   ...   136   137   138   139   140   141   142   143   ...   256




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет