Code SQL copié dans le presse-papiers
RU EN PT

Leçon 5.6 : CROSS JOIN — Le produit cartésien

La plupart des jointures nécessitent une condition de correspondance (ON). Le CROSS JOIN est différent : il retourne toutes les combinaisons possibles de lignes entre les tables jointes. Ce résultat est appelé produit cartésien.

Qu'est-ce qu'un CROSS JOIN ?

Un CROSS JOIN produit un résultat dont le nombre de lignes est le produit du nombre de lignes de la première table par celui de la seconde. Il n'y a pas de condition de correspondance : chaque ligne de la table A rencontre chaque ligne de la table B.

Visualisation :

   Table A (Couleurs)           Table B (Tailles)
   +-----------+                +-----------+
   | couleur   |                | taille    |
   +-----------+                +-----------+
   | Rouge     |  --\           | Petit     |
   | Bleu      |  ---|------>   | Moyen     |
   +-----------+  --/           | Grand     |
                                +-----------+

   Résultat (Combinaisons) :
   Rouge, Petit
   Rouge, Moyen
   Rouge, Grand
   Bleu, Petit
   Bleu, Moyen
   Bleu, Grand

Si la table A a 2 lignes et la table B en a 3, le résultat aura 2 x 3 = 6 lignes.

Syntaxe du CROSS JOIN

Il existe deux façons d'écrire un produit cartésien :

-- Syntaxe explicite
SELECT
    table1.column,
    table2.column
FROM
    table1
CROSS JOIN
    table2;

-- Syntaxe implicite avec virgule
SELECT
    table1.column,
    table2.column
FROM
    table1,
    table2;

Il est important de comprendre que ces deux formes diffèrent non seulement par le style, mais aussi par la priorité des opérations.

  • Un JOIN explicite a une priorité plus élevée et s'exécute dans la même chaîne que les autres JOIN du texte de la requête.
  • La syntaxe avec virgule a une priorité plus faible et n'est traitée qu'après les JOIN explicites.

À cause de cela, mélanger la virgule et les JOIN explicites dans un même FROM peut changer le sens de la requête ou même provoquer une erreur.

Par exemple, la requête suivante est incorrecte :

FROM a, b JOIN c ON (a.x = c.y AND b.z = c.t)

Pourquoi c'est une erreur :

  • d'abord, le b JOIN c explicite est exécuté ;
  • à ce stade, la table a n'est pas encore dans la portée de cette jointure ;
  • la référence à a.x dans la clause ON est donc invalide.

C'est pour cette raison que le CROSS JOIN explicite est généralement préférable : non pas simplement parce qu'il est « plus clair », mais parce qu'il s'accorde mieux avec les autres JOIN et évite des problèmes cachés de priorité.

Attention : Soyez prudent avec CROSS JOIN sur de grandes tables. Joindre deux tables de 1 000 lignes chacune produira 1 000 000 lignes !

Exemples pratiques (base Sakila)

1. Générer toutes les combinaisons possibles

Créer un rapport qui montre chaque catégorie de film pour chaque magasin, même si le magasin n'a pas de films dans cette catégorie.

SELECT
    s.store_id,
    c.name AS category_name
FROM
    store AS s
CROSS JOIN
    category AS c;

Cela produit une liste de toutes les catégories pour le magasin 1, puis pour le magasin 2.

2. Générer des données de test ou des matrices

CROSS JOIN est souvent utilisé pour générer des permutations pour des tests ou pour construire des calendriers où il faut voir tous les créneaux horaires pour tous les utilisateurs.

Quand utiliser CROSS JOIN

  • Générer des permutations : Quand vous avez besoin de toutes les combinaisons possibles (ex. toutes les couleurs de produit vs toutes les tailles).
  • Combler les manques : Avec un LEFT JOIN, il permet d'identifier les combinaisons manquantes dans vos données.
  • Reporting : Pour créer la "structure" d'un rapport qui doit inclure toutes les catégories, même celles sans valeur.

Points clés de cette leçon

  • CROSS JOIN retourne le produit cartésien de deux tables.
  • Il n'utilise pas de clause ON (pas de condition de correspondance).
  • Le nombre de lignes du résultat est le produit du nombre de lignes de chaque table.
  • À utiliser avec prudence sur de grands ensembles pour éviter les problèmes de performance.