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



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

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 — выдает общее число мест в само-
лете. Этот подзапрос — коррелированный, т. к. он выполняется для каждой строки,
184


6.4. Подзапросы
обрабатываемой во внешнем подзапросе, т. е. для каждой модели самолета. Для под-
счета числа проданных билетов мы использовали соединение представления «Рей-
сы» (flights_v) с таблицей «Перелеты» (ticket_flights) с последующей группи-
ровкой строк и вызовом функции count. Конечно, можно было бы вместо такого ре-
шения использовать еще один коррелированный подзапрос:
( SELECT count( tf.ticket_no )
FROM ticket_flights tf
WHERE tf.flight_id = f.flight_id
) AS fact_passengers
В таком случае уже не потребовалось бы соединять представление flights_v с таб-
лицей ticket_flights и группировать строки, достаточно было бы сделать:


Достарыңызбен бөлісу:
1   ...   140   141   142   143   144   145   146   147   ...   256




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

    Басты бет