Учебно-практическое пособие москва 2017 ббк


f2.arrival_airport, f2.aircraft_code, f2.duration



Pdf көрінісі
бет145/243
Дата21.07.2022
өлшемі3,05 Mb.
#147663
түріУчебно-практическое пособие
1   ...   141   142   143   144   145   146   147   148   ...   243
Байланысты:
Язык SQL. Базовый курс

f2.arrival_airport, f2.aircraft_code, f2.duration
)
SELECT f3.flight_no,
f3.departure_airport,
dep.airport_name AS departure_airport_name,
dep.city AS departure_city,
147


f3.arrival_airport,
arr.airport_name AS arrival_airport_name,
arr.city AS arrival_city,
f3.aircraft_code,
f3.duration,
f3.days_of_week
FROM f3,
airports dep,
airports arr
WHERE f3.departure_airport = dep.airport_code
AND f3.arrival_airport
= arr.airport_code;
Начнем ознакомление с запросом с его верхней части. Здесь мы видим конструкцию
WITH f3 AS (...), т. е. общее табличное выражение. В результате его выполнения бу-
дет сформирована временная таблица f3. Запрос, который ее формирует, содержит в
предложении FROM подзапрос, формирующий временную таблицу f2. А этот подза-
прос, в свою очередь, также содержит в предложении FROM подзапрос, формирую-
щий временную таблицу f1. Таким образом, в этой команде используется вложенный
подзапрос.
Во вложенном подзапросе используется функция to_char. Второй ее параметр —
«ID» — указывает на то, что из значения даты/времени вылета будет извлечен но-
мер дня недели. При этом нумерация дней недели соответствует стандарту ISO 8601:
понедельник — 1, воскресенье — 7. Поскольку номер дня недели представлен в
виде символьной строки, он преобразуется в тип данных integer. Таким образом,
вложенный подзапрос вычисляет плановую длительность полета (столбец duration)
и извлекает номер дня недели из даты/времени вылета по расписанию (столбец
days_of_week).
Подзапрос следующего, более высокого уровня, получив результат вложенного под-
запроса, просто группирует строки, готовя столбец days_of_week к объединению от-
дельных номеров дней недели в массивы целых чисел. При этом в предложение
GROUP BY включен столбец days_of_week, чтобы заменить дубликаты дней недели од-
ним значением. Ведь таблица flights содержит расписание рейсов на длительный пе-
риод. Поэтому рейс, который отправляется, скажем, по вторникам, появится в этом
расписании несколько раз, следовательно, день недели с номером 2 также появится в
столбце days_of_week для этого номера рейса несколько раз. В результате, если не при-
бегнуть к группировке по этому столбцу, то при формировании массива дней недели
в этом массиве будут многократные вхождения каждого дня недели, когда этот рейс
летает. В этом подзапросе присутствует и предложение ORDER BY, в которое включен
столбец days_of_week. Это необходимо для того, чтобы агрегатная функция array_agg
собрала номера дней недели в массив в возрастающем порядке этих номеров.
Во внешнем запросе вызывается функция array_agg, которая агрегирует номера дней
недели, содержащиеся в сгруппированных строках, в массивы целых чисел. На этом
работа конструкции WITH f3 AS (...) завершается. В результате вместо нескольких
строк в таблице flights, соответствующих вылетам конкретного рейса в различные
дни недели, формируется одна строка в представлении routes, в этой строке все дни
недели, в которые выполняется конкретный рейс, собраны в массив целых чисел.
И, наконец, главный запрос выполняет соединение временной таблицы f3 с табли-
цей «Аэропорты» (airports), причем, дважды. Это нужно потому, что в таблице f3 есть
148


столбец f3.departure_airport (аэропорт отправления) и столбец f3.arrival_airport (аэро-
порт прибытия), для каждого из них нужно выбрать наименование аэропорта и на-
именование города из таблицы airports. О том, как нужно рассуждать при двукратном
использовании одной и той же таблицы в соединении, мы уже говорили ранее в раз-
деле 5.4 «Представления».


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




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

    Басты бет