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



Pdf көрінісі
бет150/256
Дата18.11.2022
өлшемі1.88 Mb.
#465124
түріУчебное пособие
1   ...   146   147   148   149   150   151   152   153   ...   256
sql osnovi yazika

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 для этого номера рейса несколько раз. В результате,
191


Глава 6. Запросы
если не прибегнуть к группировке по этому столбцу, то при формировании масси-
ва дней недели в этом массиве будут многократные вхождения каждого дня недели,
когда этот рейс летает. В этом подзапросе присутствует и предложение ORDER BY,
в которое включен столбец days_of_week. Это необходимо для того, чтобы агре-
гатная функция array_agg собрала номера дней недели в массив в возрастающем
порядке этих номеров.
Во внешнем запросе вызывается функция array_agg, которая агрегирует номера
дней недели, содержащиеся в сгруппированных строках, в массивы целых чисел.
На этом работа конструкции WITH f3 AS (...) завершается. В результате вместо
нескольких строк в таблице flights, соответствующих вылетам конкретного рейса
в различные дни недели, формируется одна строка в представлении routes, в этой
строке все дни недели, в которые выполняется конкретный рейс, собраны в массив
целых чисел.
И, наконец, главный запрос выполняет соединение временной таблицы f3 с таб-
лицей «Аэропорты» (airports), причем дважды. Это нужно потому, что в таб-
лице f3 есть столбец f3.departure_airport (аэропорт отправления) и столбец
f3.arrival_airport (аэропорт прибытия), для каждого из них нужно выбрать на-
именование аэропорта и наименование города из таблицы airports. О том, как
нужно рассуждать при двукратном использовании одной и той же таблицы в соеди-
нении, мы уже говорили ранее в разделе 5.4 «Представления».


Достарыңызбен бөлісу:
1   ...   146   147   148   149   150   151   152   153   ...   256




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

    Басты бет