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.
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.
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.
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.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 :
b JOIN c explicite est exécuté ;a n'est pas encore dans la portée de cette jointure ;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 JOINsur de grandes tables. Joindre deux tables de 1 000 lignes chacune produira 1 000 000 lignes !
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.
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.
LEFT JOIN, il permet d'identifier les combinaisons manquantes dans vos données.ON (pas de condition de correspondance).