Учебник

Оглавление

Подзапросы

Выведем все рейсы из Ростова:

SELECT
	flights.flight_id,
  flights.flight_no,
  flights.scheduled_departure
FROM
	bookings.flights
WHERE
	departure_airport='ROV'

У нас также есть таблица с информацией о том, на какие рейсы проданы билеты ticket_flights. Вспомним про группировку и получим количество проданных билетов на каждый из рейсов:

SELECT
	ticket_flights.flight_id,
  count(*) "Билетов"
FROM
	bookings.ticket_flights
GROUP BY
	ticket_flights.flight_id

Так же, как мы присоединяли таблицу при помощи JOIN, можно присоединить и целый запрос. Такой присоединённый запрос будем называть подзапросом:

SELECT
  flights.flight_id,
  flights.flight_no,
  flights.scheduled_departure,
  flights.aircraft_code,
  tickets_count."Билетов"
FROM
  bookings.flights
  JOIN
    (
      SELECT
      	ticket_flights.flight_id,
        count(*) "Билетов"
      FROM
      	bookings.ticket_flights
      GROUP BY
      	ticket_flights.flight_id
    ) AS tickets_count
      ON tickets_count.flight_id=flights.flight_id
WHERE
  departure_airport='ROV'

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

То же самое можно записать иначе при помощи конструкции WITH:

WITH
  tickets_count AS
    (
      SELECT
        ticket_flights.flight_id,
        count(*) "Билетов"
      FROM
        bookings.ticket_flights
      GROUP BY
        ticket_flights.flight_id
    )
SELECT
  flights.flight_id,
  flights.flight_no,
  flights.scheduled_departure,
  flights.aircraft_code,
  tickets_count."Билетов"
FROM
  bookings.flights
  JOIN tickets_count
      ON tickets_count.flight_id=flights.flight_id
WHERE
  departure_airport='ROV'

Здесь мы после WITH объявляем подзапрос tickets_count, который используем дальше после FROM.

Добавим сюда информацию о количестве выданных посадочных талонов на рейсы:

WITH
  tickets_count AS
    (
      SELECT
        ticket_flights.flight_id,
        count(*) "Билетов"
      FROM
        bookings.ticket_flights
      GROUP BY
        ticket_flights.flight_id
    ),
  passes_count AS
    (
      SELECT
        boarding_passes.flight_id,
        count(*) "Посадочных талонов"
      FROM
        bookings.boarding_passes
      GROUP BY
        boarding_passes.flight_id
    )
SELECT
  flights.flight_id,
  flights.flight_no,
  flights.scheduled_departure,
  flights.aircraft_code,
  tickets_count."Билетов",
  passes_count."Посадочных талонов"
FROM
  bookings.flights
  JOIN tickets_count
    ON tickets_count.flight_id=flights.flight_id
  JOIN passes_count
    ON passes_count.flight_id=flights.flight_id
WHERE
  departure_airport='ROV'

Количество посадочных талонов совпадает с количеством билетов на рейс, если все пассажиры прошли регистрацию.

Таким образом можно создавать довольно сложные запросы.