Cette tâche illustre l'utilisation d'un des outils les plus puissants en SQL pour analyser les relations dans les données : joindre une table à elle-même (SELF JOIN). Décomposons la logique de la solution étape par étape.
Nous devons trouver toutes les options de vol possibles de l'aéroport de Pulkovo (LED) à Bryansk (BZK) avec exactement une escale.
Un trajet avec une escale consiste en deux vols indépendants reliés par un aéroport intermédiaire.
Notre objectif est de trouver toutes les paires de vols où l'aéroport d'arrivée du premier vol correspond à l'aéroport de départ du second.
Pour implémenter cette logique, nous considérons la table des vols comme deux tables différentes, en utilisant des alias comme first_leg (premier segment) et second_leg (second segment).
first_leg pour trouver tous les vols partant de LED.first_leg.departure_airport = 'LED'.second_leg, on cherche tous les vols arrivant à BZK.second_leg.arrival_airport = 'BZK'.first_leg.arrival_airport = second_leg.departure_airport.connection_airport).second_leg.scheduled_departure > first_leg.scheduled_arrivalfirst_leg.departure_airport)first_leg.arrival_airport ou second_leg.departure_airport)second_leg.arrival_airport)Ainsi, le SELF JOIN permet de "déplier" une table et de faire correspondre ses lignes entre elles pour trouver des itinéraires complexes.
select
first_leg.flight_no flight1_no,
first_leg.departure_airport,
first_leg.arrival_airport connection_airport,
first_leg.scheduled_arrival - first_leg.scheduled_departure flight1_time,
second_leg.scheduled_departure - first_leg.scheduled_arrival connection_time,
second_leg.flight_no flight2_no,
second_leg.arrival_airport,
second_leg.scheduled_arrival - second_leg.scheduled_departure flight2_time,
(second_leg.scheduled_arrival - first_leg.scheduled_departure) total_trip_time
from flights first_leg
join flights second_leg on first_leg.arrival_airport=second_leg.departure_airport
and second_leg.arrival_airport = 'BZK'
and second_leg.scheduled_departure > first_leg.scheduled_arrival
where first_leg.departure_airport = 'LED'
and first_leg.scheduled_departure between '2017-08-16' and '2017-08-17'
and second_leg.scheduled_departure between '2017-08-16' and '2017-08-17'
order by (second_leg.scheduled_arrival - first_leg.scheduled_departure)
limit 1;