вложенные подзапросы . Это означает,
что один подзапрос находится внутри другого. Давайте в качестве примера рассмот-
рим такую ситуацию: руководство авиакомпании хочет выяснить степень заполне-
ния самолетов на всех рейсах, ведь отправлять полупустые самолеты не очень выгод-
но. Таким образом, запрос должен не только выдавать число билетов, проданных на
данный рейс, и общее число мест в самолете, но должен также вычислять отношение
этих двух показателей.
Вот какой запрос получился:
SELECT ts.flight_id, ts.flight_no, ts.scheduled_departure_local, ts.departure_city, ts.arrival_city, a.model, ts.fact_passengers, ts.total_seats, round( ts.fact_passengers::numeric / ts.total_seats::numeric, 2 ) AS fraction FROM ( SELECT f.flight_id, f.flight_no, f.scheduled_departure_local, f.departure_city, f.arrival_city, f.aircraft_code, count( tf.ticket_no ) AS fact_passengers, ( SELECT count( s.seat_no ) FROM seats s WHERE s.aircraft_code = f.aircraft_code ) AS total_seats FROM flights_v f JOIN ticket_flights tf ON f.flight_id = tf.flight_id WHERE f.status = 'Arrived' GROUP BY 1, 2, 3, 4, 5, 6 ) AS ts JOIN aircrafts AS a ON ts.aircraft_code = a.aircraft_code ORDER BY ts.scheduled_departure_local; Самый внутренний подзапрос — total_seats — выдает общее число мест в самолете.
Этот подзапрос — коррелированный, т. к. он выполняется для каждой строки, обра-
батываемой во внешнем подзапросе, т. е. для каждой модели самолета. Для подсче-
та числа проданных билетов мы использовали соединение представления «Рейсы»
(flights_v) с таблицей «Перелеты» (ticket_flights) с последующей группировкой строк
и вызовом функции count. Конечно, можно было бы вместо такого решения исполь-
зовать еще один коррелированный подзапрос: