Leçon 5.6 · Temps de lecture : ~5 min
Le SQL CROSS JOIN combine chaque ligne d'une table avec chaque ligne d'une autre ; le résultat s'appelle le produit cartésien. Dans cette leçon, vous apprendrez la syntaxe de CROSS JOIN, la taille de son résultat, et comment l'utiliser pour construire des grilles de rapport qui affichent des zéros au lieu de lignes manquantes.
SQL CROSS JOIN : toutes les combinaisons de lignes
Toutes les jointures vues jusqu'ici associaient des lignes selon une condition. CROSS JOIN n'a pas de condition : chaque ligne de la première table rencontre chaque ligne de la seconde. C'est rarement ce que l'on veut pour des données liées, mais c'est exactement ce qu'il faut pour générer toutes les combinaisons : chaque magasin avec chaque catégorie, chaque produit avec chaque taille, chaque jour avec chaque employé.
Ce que renvoie CROSS JOIN
Si la première table a m lignes et la seconde n lignes, le résultat a m × n lignes. Il n'y a pas de clause ON.
Syntaxe de base
SELECT table1.column1, table2.column2
FROM table1
CROSS JOIN table2;
L'ancienne syntaxe avec virgule, FROM table1, table2 sans condition, signifie la même chose. CROSS JOIN exprime l'intention explicitement et est préférable.
Exemple : chaque magasin avec chaque catégorie
SELECT s.store_id, c.name AS category
FROM store AS s
CROSS JOIN category AS c
ORDER BY s.store_id, c.name;
Résultat : 32 lignes : 2 magasins × 16 catégories, chaque magasin avec chaque catégorie.
Construire une grille de rapport
L'usage le plus pratique de CROSS JOIN est le « squelette » d'un rapport. Supposons que vous ayez besoin du nombre de films par magasin et par catégorie, y compris les combinaisons sans aucun film. Une jointure classique avec GROUP BY ne renvoie que les combinaisons présentes dans les données. Un CROSS JOIN crée d'abord toutes les combinaisons, puis un LEFT JOIN y rattache les données :
SELECT s.store_id,
c.name AS category,
COUNT(i.inventory_id) AS copies
FROM store AS s
CROSS JOIN category AS c
LEFT JOIN film_category AS fc ON fc.category_id = c.category_id
LEFT JOIN inventory AS i ON i.film_id = fc.film_id
AND i.store_id = s.store_id
GROUP BY s.store_id, c.name
ORDER BY s.store_id, c.name;
Résultat : 32 lignes avec le nombre d'exemplaires de films de chaque catégorie dans chaque magasin. Une combinaison sans exemplaire afficherait 0 au lieu de disparaître.
COUNT(i.inventory_id) ne compte que les exemplaires trouvés, donc une combinaison sans exemplaire obtient 0. La même technique comble les trous des séries temporelles : un produit cartésien entre une liste de dates et une liste de produits donne une ligne par produit et par jour.
Le produit cartésien accidentel
Un produit cartésien apparaît souvent par erreur, quand une condition de jointure manque :
-- Pas de condition de jointure : chaque acteur est combiné avec chaque film
SELECT COUNT(*) AS row_count
FROM actor, film;
Résultat : 200 000 lignes : 200 acteurs × 1000 films.
Si une requête renvoie soudain beaucoup trop de lignes, ou si des lignes se répètent dans des combinaisons étranges, vérifiez que chaque table jointe a une condition de jointure. Deux tables de 100 000 lignes chacune produisent 10 milliards de combinaisons, ce qui peut bloquer la base de données.
Points clés :
CROSS JOINcombine chaque ligne d'une table avec chaque ligne d'une autre.- Le résultat a
m × nlignes et pas de conditionON. FROM a, bsans condition est aussi un produit cartésien, souvent accidentel.CROSS JOINplusLEFT JOINconstruit une grille de rapport complète, avec des zéros pour les combinaisons absentes.- Vérifiez la taille du résultat avant de faire un produit cartésien sur de grandes tables.
Questions fréquentes
Qu'est-ce qu'un produit cartésien en SQL ?
L'ensemble de toutes les combinaisons de lignes de deux tables. Si une table a 2 lignes et l'autre 16, le produit cartésien a 32 lignes. CROSS JOIN le renvoie explicitement.
Quelle est la différence entre CROSS JOIN et INNER JOIN ?
INNER JOIN ne garde que les combinaisons qui satisfont la condition ON. CROSS JOIN garde toutes les combinaisons. Un INNER JOIN avec une condition toujours vraie se comporte comme un CROSS JOIN.
Quand faut-il utiliser CROSS JOIN ?
Quand vous avez besoin de toutes les combinaisons : grilles de rapport, variantes de produits (couleurs × tailles), calendriers (dates × employés) ou pour combler les trous des séries temporelles avec un LEFT JOIN.