timezone( arr.timezone, f.actual_arrival )
AS actual_arrival_local,
f.actual_arrival - f.actual_departure AS actual_duration
FROM flights f,
airports dep,
airports arr
WHERE f.departure_airport = dep.airport_code
AND f.arrival_airport = arr.airport_code;
В этом представлении используется не только таблица «Рейсы» (flights), но также и
таблица «Аэропорты» (airports). Причем она используется, условно говоря, дважды.
Поясним, что мы имеем в виду. Как вы уже знаете из главы 3, при соединении двух
таблиц в результирующую выборку попадают те комбинации строк из первой и вто-
рой таблиц, которые удовлетворяют условию, указанному в предложении WHERE.
Будем рассуждать от противного. Пусть в предложение FROM таблица «Аэропорты»
(airports) будет указана только один раз, тогда предложения FROM и WHERE будут
выглядеть так:
FROM flights f, airports a
WHERE f.departure_airport = a.airport_code
AND f.arrival_airport = a.airport_code;
Это означает, что при соединении таблиц flights и airports PostgreSQL будет пытать-
ся для каждой строки из таблицы flights найти такую строку в таблице airports, в
которой значение атрибута airport_code будет равно не только значению атрибута
departure_airport, но также и значению атрибута arrival_airport в таблице flights. Полу-
чается, что данное условие будет выполнено, если только аэропорт вылета и аэропорт
назначения будет одним и тем же. Однако в сфере пассажирских авиаперевозок та-
ких рейсов не бывает. Конечно, иногда самолеты возвращаются в пункт вылета, но
это уже совсем другая ситуация, которая в нашей учебной базе данных не учитыва-
ется.
Таким образом, приходим к выводу о том, что каждую строку из таблицы «Рейсы»
(flights) необходимо соединять с двумя
различными
строками из таблицы «Аэропор-
ты»: ведь аэропорт вылета и аэропорт назначения — это
различные
аэропорты. Одна-
ко при однократном включении таблицы «Аэропорты» (airports) в предложение FROM
сделать это невозможно, поэтому поступают так: к таблице airports в предложении
FROM обращаются дважды, как будто это две копии одной и той же таблицы. Конеч-
но, на самом деле никаких копий не создается, а просто в результате поиск строк в
ней будет производиться дважды: один раз для атрибута departure_airport, а второй
раз — для атрибута arrival_airport. Но поскольку необходимо обеспечить однознач-
ную идентификацию, то каждой «копии» (экземпляру) таблицы airports присваива-
ют уникальный псевдоним, в нашем случае это dep и arr, т. е. departure и arrival. Эти
псевдонимы указывают, из какой «копии» (экземпляра) таблицы airports нужно брать
значение атрибута airport_code для сопоставления с атрибутами departure_airport и
arrival_airport.
Рассмотрев этот пример, вновь обратимся к соединениям такого типа и покажем три
способа выполнения
Достарыңызбен бөлісу: