0Pricing
Coding Interview Prep · Leçon

CROSS JOIN et produits cartésiens

Utiliser volontairement les jointures croisées pour générer des combinaisons et éviter celles qui font exploser le nombre de lignes

CROSS JOIN et produits cartésiens est une leçon Coding Interview Prep gratuite sur CoddyKit. Ceci est la leçon 1 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Coding Interview Prep, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Coding Interview Prep comprend 4 leçons au total.

La jointure utilisée par les recruteurs pour vous piéger

Une CROSS JOIN associe chaque ligne de la table de gauche à chaque ligne de la table de droite. Il n'y a aucune condition ON. Si la table A contient 4 lignes et la table B 3 lignes, le résultat contient 4 x 3 = 12 lignes.

On appelle cela un produit cartésien. Les recruteurs posent des questions à ce sujet pour deux raisons : vérifier que vous savez générer volontairement des combinaisons et voir si vous reconnaissez une jointure CROSS accidentelle qui fait exploser le nombre de lignes du résultat.

Syntaxe explicite de CROSS JOIN

La manière moderne et lisible d'écrire un produit cartésien consiste à utiliser explicitement le mot-clé CROSS JOIN. Remarquez qu'il n'y a aucune clause ON, ce qui indique clairement l'intention à la personne qui relit le code.

Nous associons ici chaque taille à chaque couleur afin de construire une matrice complète de produits.

SELECT s.size, c.color
FROM sizes s
CROSS JOIN colors c;

L'ancienne syntaxe avec des virgules

Vous verrez encore des produits cartésiens écrits avec une virgule dans la clause FROM, sans condition de jointure. Il s'agit de l'ancienne syntaxe ANSI.

Elle produit exactement le même résultat que CROSS JOIN, mais elle est dangereuse : si vous aviez l'intention d'ajouter une condition de jointure et que vous l'avez oubliée, vous obtenez silencieusement une jointure croisée au lieu d'une erreur. Préférez CROSS JOIN.

-- Same result as CROSS JOIN, but easy to write by accident
SELECT s.size, c.color
FROM sizes s, colors c;

Exemple détaillé : créer un tableau des tailles

Supposons qu'une boutique vende des tee-shirts en 3 tailles et 4 couleurs et souhaite une ligne pour chaque variante possible, même pour celles qui ne sont pas encore en stock. Une jointure croisée génère les 12 combinaisons en une seule étape.

C'est l'utilisation intentionnelle la plus courante : produire une grille complète d'options.

SELECT s.size, c.color, 0 AS stock_qty
FROM sizes s
CROSS JOIN colors c
ORDER BY s.size, c.color;

Générer une grille de calendrier

Autre utilisation classique en entretien de CROSS JOIN : créer une grille dense afin que chaque combinaison soit présente, même lorsque des données manquent.

Nous croisons ici chaque magasin avec chaque date afin qu'une LEFT JOIN ultérieure avec les ventes fournisse une ligne par magasin et par jour, en remplaçant les lacunes par des zéros. La jointure croisée garantit qu'aucun couple magasin-jour n'est ignoré.

SELECT st.store_id, d.day
FROM stores st
CROSS JOIN calendar d
WHERE d.day BETWEEN DATE '2024-01-01' AND DATE '2024-01-31';

L'explosion cartésienne accidentelle

Le danger sur lequel les personnes qui vous interrogent cherchent à vous mettre à l'épreuve : vous joignez deux tables, mais vous oubliez la condition de jointure. Au lieu de renvoyer une erreur, la base de données renvoie tranquillement toutes les combinaisons.

Si orders contient 100 000 lignes et customers 50 000, le résultat comporte 5 milliards de lignes. Les requêtes restent bloquées, la mémoire est saturée et les chiffres sont fortement gonflés. Reconnaître ce schéma lors d'une revue de code est un signe très positif.

-- BUG: no join condition between the two tables
SELECT o.order_id, c.name
FROM orders o, customers c;
-- returns COUNT(orders) * COUNT(customers) rows

Comment repérer une jointure croisée accidentelle

Les symptômes que les personnes qui vous interrogent veulent vous voir citer :

  • Le nombre de lignes correspond approximativement au produit des tailles des deux tables, et non à leur somme.
  • Les agrégats comme SUM sont gonflés d'un facteur constant.
  • Le plan d'exécution affiche une boucle imbriquée sans filtre de jointure.

La correction consiste presque toujours à ajouter une égalité ON ou WHERE manquante entre les tables.

CROSS JOIN ou INNER JOIN avec un ON toujours vrai

Un CROSS JOIN est logiquement identique à un INNER JOIN ... ON 1=1. Les deux produisent le produit cartésien complet.

En réalité, une jointure interne est simplement une jointure croisée suivie d'un filtrage sur la condition ON. Ce modèle mental explique pourquoi l'absence de condition transforme une jointure interne en jointure croisée.

-- These two queries return identical results
SELECT * FROM a CROSS JOIN b;
SELECT * FROM a INNER JOIN b ON 1 = 1;

Effectuer une jointure croisée avec une table de nombres

Une astuce puissante consiste à effectuer une jointure croisée avec une petite table numbers ou generate_series afin de multiplier volontairement les lignes. Cette technique sert à développer une ligne unique en plusieurs lignes, par exemple pour transformer une quantité en lignes représentant des unités individuelles.

Ici, chaque ligne de produit est répétée qty fois en la joignant à une série et en conservant les nombres jusqu'à la quantité indiquée.

SELECT p.product_id, n.n AS unit_number
FROM products p
CROSS JOIN generate_series(1, 100) AS n(n)
WHERE n.n <= p.qty;

Performances et bonnes pratiques

Comme la sortie augmente de manière multiplicative, n'effectuez jamais de jointure croisée entre deux grandes tables. Faites en sorte qu'au moins un côté soit très petit (une liste de tailles, un petit calendrier ou une table de nombres).

En entretien, dites-le explicitement : « Un CROSS JOIN n'est sûr que lorsqu'un côté est petit et borné ; sinon, le résultat devient impossible à gérer. » Cette phrase montre que vous savez faire preuve de discernement, et pas seulement que vous connaissez la syntaxe.

Quand utiliser CROSS JOIN

Utilisez volontairement CROSS JOIN lorsque vous avez besoin de toutes les combinaisons de deux ensembles :

  • Générer des matrices d'options (taille x couleur).
  • Densifier des séries temporelles (magasin x jour) avant une LEFT JOIN.
  • Développer des lignes au moyen d'une table de nombres.

Si vous ne voulez pas toutes les combinaisons, vous avez presque certainement besoin d'une jointure avec une condition ON.

Vérification rapide

Vérifiez votre compréhension des produits cartésiens.

Récapitulatif : CROSS JOIN

Points essentiels :

  • Un CROSS JOIN associe chaque ligne de gauche à chaque ligne de droite ; la taille de la sortie est le produit des entrées.
  • La syntaxe avec une virgule et sans condition produit le même produit cartésien, souvent par accident.
  • Utilisez-le volontairement pour les grilles de combinaisons, la densification des séries temporelles et le développement de lignes au moyen d'une table de nombres.
  • Une jointure interne dont le ON est manquant se transforme silencieusement en jointure croisée : c'est le bogue d'explosion que les personnes qui vous interrogent adorent.

Questions Fréquemment Posées

La leçon « CROSS JOIN et produits cartésiens » est-elle gratuite ?

Oui — le texte complet de « CROSS JOIN et produits cartésiens » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Coding Interview Prep, passe à CoddyKit PRO. Le cours Coding Interview Prep comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « CROSS JOIN et produits cartésiens » ?

Utiliser volontairement les jointures croisées pour générer des combinaisons et éviter celles qui font exploser le nombre de lignes Tu pratiques Coding Interview Prep avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Coding Interview Prep ?

Aucune expérience préalable n'est requise. Coding Interview Prep sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 1 sur 4.

Combien de temps prend la leçon « CROSS JOIN et produits cartésiens » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Coding Interview Prep ?

Oui. Chaque leçon Coding Interview Prep inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. CROSS JOIN et produits cartésiens
  2. SELF JOIN pour les hiérarchies
  3. Comparer des lignes au sein d’une même table
  4. Choisir le bon type de jointure
← Retour à Coding Interview Prep