Aller au contenu

Les jointures multiples

Les jointures permettent de relier plusieurs tables entre elles pour obtenir une vue cohérente des données. Quand on joint deux, trois, ou plus de tables, Oracle exécute la requête en combinant les lignes selon les conditions de jointure, dans l'ordre d'écriture.

L’idée clé :

👉 Chaque jointure réduit ou enrichit le jeu de résultats en fonction de la relation entre les tables.

Schéma

Voici un schéma de base utilisé dans les explications plus bas :

client-commandes

Une première jointure

Supposons la requête suivante :

SELECT clients.nom, commandes.id_commande, commandes.montant
FROM clients 
INNER JOIN commandes  
ON clients.id_client = commandes.id_client;

Ce qui se passe :

  • Extrait la table CLIENTS.
  • Parcourt chaque ligne de CLIENTS.
  • Cherche dans COMMANDES les lignes où id_client correspond.
  • Produit une ligne de résultat pour chaque correspondance.

Donc, si on a les lignes initiales suivantes :

CLIENTS

ID_CLIENT NOM
1 Martin
2 Dubois

COMMANDES

ID_COMMANDE ID_CLIENT MONTANT
101 1 250
102 1 90
103 2 120

On obtient temporairement en mémoire le résultat :

ID_CLIENT NOM ID_COMMANDE ID_CLIENT MONTANT
1 Martin 101 1 250
1 Martin 102 1 90
2 Dubois 103 2 120

Pour finalement extraire les colonnes qui nous intéresse dans le SELECT.

Deux autres jointures

Lorsqu'on ajoute une deuxième jointure, alors Oracle :

  1. Prend le résultat précédent.
  2. Pour chaque ligne du résultat, cherche une correspondance avec la nouvelle table
  3. Produit une ligne de résultat pour chaque correspondance.

Donc si on lance la requête :

SELECT clients.nom, produit.libelle, lignes_commande.quantite
FROM clients 
INNER JOIN commandes 
    ON clients.id_client = commandes.id_client
INNER JOIN lignes_commande 
    ON commandes.id_commande = lignes_commande.id_commande
INNER JOIN produits 
    ON lignes_commande.id_produit = produits.id_produit;
  1. Ajoute à Clients les commandes ayant une correspondance avec un client

    Les colonnes ne sont pas toutes représentées

    ID_CLIENT NOM ID_COMMANDE ID_CLIENT MONTANT
    1 Martin 101 1 250
    1 Martin 102 1 90
    2 Dubois 103 2 120
  2. Ajoute au résultat de 1, les lignes de commandes ayant une correspondance avec l'id de commande

    Les colonnes ne sont pas toutes représentées

    ID_CLIENT NOM ID_COMMANDE ID_CLIENT MONTANT ID_COMMANDE ID_PRODUIT QUANTITE
    1 Martin 101 1 250 101 10 1
    1 Martin 101 1 250 101 11 2
    2 Dubois 103 2 120 103 11 1

    Note : La commande 102 a disparu, car aucune ligne de commande n'a pu correspondre. Le INNER JOIN élimine les lignes qui n'ont pas de correspondances.

  3. Ajoute au résultat de 2, les informations de produits correspondants

    Les colonnes ne sont pas toutes représentées

    ID_CLIENT NOM ID_COMMANDE ID_CLIENT MONTANT ID_COMMANDE ID_PRODUIT QUANTITE ID_PRODUIT LIBELLE
    1 Martin 101 1 250 101 10 1 10 Clavier
    1 Martin 101 1 250 101 11 2 11 Souris
    2 Dubois 103 2 120 103 11 1 11 Souris
  4. Extrait les colonnes demandées dans le SELECT

    NOM Libelle Quantite
    Martin Clavier 1
    Martin Souris 2
    Dubois Souris 1

🎯 Notes importantes

✔ Une jointure dépend toujours de la précédente (effet domino)

✔ La requête se lit de gauche à droite (important pour les jointures externes)

✔ Chaque jointure ajoute des colonnes

✔ Peut ajouter des lignes si plus d'une correspondance, mais peut aussi retirer des lignes si aucune correspondance (INNER JOIN)

✔ Il est possible d'utiliser différentes jointures dans un SELECT, mais l'effet domino est toujorus présent