- 1. Fondamentaux des JOINs en SQL
- 2. INNER JOIN — Combiner les lignes correspondantes
- 3. LEFT JOIN — Inclure toutes les lignes de la table de gauche
- 4. RIGHT JOIN — Inclure tous les enregistrements de la table de droite
- 5. FULL OUTER JOIN — Tout combiner des deux tables
- 6. CROSS JOIN — Le produit cartésien
- 7. SELF JOIN - Joindre une table à elle-même
- 8. Scénarios et techniques pratiques de JOIN
- 9. Algorithmes de jointure
Explication de la Carte des sièges d'avion
Objectif principal de la tâche
L'objectif est de créer une carte visuelle des sièges pour un modèle d'avion spécifique (ici, le 'Boeing 777-300'). Le résultat doit être une liste de rangées, où pour chaque rangée et classe de service ('Business', 'Économie', 'Confort'), un tableau des sièges disponibles est affiché.
Par exemple, pour la 1ère rangée en classe business :
- Rangée : 1
- Sièges : ["A", "C", "D", "F"]
- Classe : Business
Logique de la solution (étape par étape)
Étape 1 : Sélection du bon avion.
- Filtrez les données pour ne travailler qu'avec les sièges du modèle 'Boeing 777-300'.
- Pour cela, faites une jointure entre la table
seatsetaircrafts_datasur le champ communaircraft_code. - Ajoutez dans la clause
WHEREle modèle d'avion souhaité.
Étape 2 : Séparer le numéro de siège en rangée et lettre.
- Le numéro de siège dans la table
seatsest du type12A,30K, où12est la rangée etAla lettre du siège. - La rangée s'obtient en retirant la partie lettre du champ
seat_no(par exemple avec la fonctionrtrimou des expressions régulières). - La lettre du siège s'obtient en prenant le dernier caractère de
seat_no(par exemple avec la fonctionright).
- Le numéro de siège dans la table
Étape 3 : Regrouper les sièges.
- L'idée est de regrouper tous les sièges qui sont dans la même rangée et la même classe de service (
fare_conditions). - La clause
GROUP BYdoit donc inclure la rangée calculée et la classe de service.
- L'idée est de regrouper tous les sièges qui sont dans la même rangée et la même classe de service (
Étape 4 : Agréger les lettres de sièges dans un tableau.
- Pour chaque groupe (ex : "rangée 10, classe économie"), il faut rassembler toutes les lettres de sièges (
A,B,C, etc.) dans une liste ou un tableau. - La fonction d'agrégation
json_agg(PostgreSQL) est idéale, elle crée un tableau JSON à partir des valeurs. - Pour garantir l'ordre des sièges (A, B, C, pas C, A, B), il faut ajouter un tri dans la fonction
json_agg.
- Pour chaque groupe (ex : "rangée 10, classe économie"), il faut rassembler toutes les lettres de sièges (
Étape 5 : Tri final.
- Pour que la carte soit logique (rangées de l'avant vers l'arrière), le résultat doit être trié par numéro de rangée.
Spoiler : la requête SQL de la solution est cachée ci-dessous. Cliquez pour révéler.
select
rtrim(seat_no, 'ABCDEFGHKJ')::int "row",
json_agg(right(seat_no, 1) order by right(seat_no, 1)) seats ,
fare_conditions
from seats
join aircrafts_data using(aircraft_code)
where aircrafts_data.model->>'fr' = 'Boeing 777-300'
group by rtrim(seat_no, 'ABCDEFGHKJ'), fare_conditions
order by "row";