SELECT aa.city, aa.airport_code, aa.airport_name FROM ( 140
SELECT city, count( * ) FROM airports GROUP BY city HAVING count( * ) > 1 ) AS a JOIN airports AS aa ON a.city = aa.city ORDER BY aa.city, aa.airport_name; Благодаря использованию предложения HAVING, подзапрос выбирает города, в ко-
торых более одного аэропорта, и формирует временную таблицу в таком виде:
city
| count
-----------+-------
Ульяновск |
2
Москва
|
3
(2 строки)
А в главном запросе выполняется соединение временной таблицы с таблицей «Аэро-
порты» (airports).
city
| airport_code |
airport_name
-----------+--------------+---------------------
Москва
| VKO
| Внуково
Москва
| DME
| Домодедово
Москва
| SVO
| Шереметьево
Ульяновск | ULV
| Баратаевка
Ульяновск | ULY
| Ульяновск-Восточный
(5 строк)
Для иллюстрации использования
подзапросов в предложении HAVING решим та-
кую задачу: определить число маршрутов, исходящих из тех аэропортов, которые
расположены восточнее географической долготы 150
◦
.
SELECT departure_airport, departure_city, count( * ) FROM routes GROUP BY departure_airport, departure_city HAVING departure_airport IN ( SELECT airport_code FROM airports WHERE longitude > 150 ) ORDER BY count DESC; Подзапрос формирует список аэропортов, которые и будут отобраны с помощью
предложения HAVING после выполнения группировки.
departure_airport |
departure_city
| count
-------------------+--------------------------+-------
DYR
| Анадырь
|
4
GDX
| Магадан
|
3
PKC
| Петропавловск-Камчатский |
1
(3 строки)
141