Retour à la liste des articles Articles
7 minutes de lecture

Peut-on réunir deux tables sans colonne commune ?

Oui, vous pouvez le faire ! La réponse la plus longue est oui, il existe plusieurs façons de combiner deux tables sans colonne commune, notamment CROSS JOIN (produit cartésien) et UNION. Cette dernière n'est techniquement pas une jointure, mais peut être pratique pour fusionner des tables en SQL. Dans cet article, je vais vous guider à travers les différentes solutions avec des exemples.

Quand avez-vous besoin de joindre des tables sans colonne commune ?

Les débutants qui s'initient à SQL sont généralement initiés aux jointures équi standard, dans lesquelles deux tables sont combinées par une colonne commune. Cependant, les tâches réelles d'un analyste de données sont généralement plus diverses et complexes.

Par exemple, il existe de nombreux cas d'utilisation pour une non équi-jointure, lorsque deux tables sont combinées en utilisant des opérateurs conditionnels autres que le signe égal. Si vous n'êtes pas familier avec ce type de jointure, consultez notre cours interactif Les jointures en SQL interactif. Il propose plus de 90 exercices pratiques sur différents types de jointures.

Dans d'autres cas, vous pouvez souhaiter disposer de toutes les combinaisons de lignes des deux tables. Par exemple, si vous gérez un restaurant, vous voudrez peut-être voir toutes les combinaisons possibles de vins de votre carte des vins et de plats principaux de votre menu.

Ou bien, imaginez que les informations sur vos fournisseurs sont stockées dans des tables différentes. Elles peuvent même avoir des noms de colonnes différents selon le type de produit (par exemple, vins, jus, fruits, etc.). Vous pourriez vouloir combiner toutes les informations pour générer une seule table avec tous les fournisseurs.

Dans ce cas, vous voudrez combiner deux tables ou plus sans avoir besoin d'une colonne commune. On pourrait croire qu'il s'agit d'une tâche SQL assez simple. Et bien, c'est le cas ! Je vais vous proposer quelques solutions dans ce guide.

Mais d'abord, explorons les données que nous utiliserons pour nos exemples.

Apprendre à connaître les données

Nous gérons un restaurant et avons des données pertinentes stockées dans plusieurs tables, parmi lesquelles figurent wine et main_course.

La table wine contient l'ID du vin, le nom du vin, l'ID du fournisseur et le prix :

idnamesupplier_idprice
1Merlot5007.95
2House4002.45
3Sangiovese6005.20

Le site main_course contient l'ID du plat principal, le nom, l'ID du fournisseur principal de ce plat et le prix, pour chaque plat :

main_course

idnamemajor_supplier_idprice
1Cardamom Maple Salmon20019.99
2Classic Macaroni & Cheese1008.99
3Baked Teriyaki Chicken30011.99
4Blue Cheese Beef Tenderloin40015.99

Voyons comment nous pouvons combiner ces tables pour obtenir les résultats souhaités.

Comment combiner deux tables sans colonne commune ?

Dans notre premier exemple, nous voulons voir toutes les combinaisons possibles de vins et de plats principaux de notre menu. Il existe au moins deux approches pour combiner les tables wine et main_course pour obtenir le résultat souhaité.

Utilisation de la syntaxe " FROM Table1, Table2 ".

L'une des façons de combiner deux tables sans colonne commune consiste à utiliser une syntaxe obsolète pour joindre des tables. Avec cette syntaxe, il suffit de lister les tables que l'on souhaite joindre dans la clause FROM puis d'utiliser une clause WHERE pour ajouter des conditions de jonction si nécessaire.

Si ce que nous voulons est chaque combinaison de lignes de deux tables, il n'est pas nécessaire d'inclure des conditions de jointure. Nous pouvons utiliser une requête comme celle-ci :

SELECT w.name AS wine, m.name AS main_course
FROM wine w, main_course m;

La requête renverra un produit cartésien (une jointure croisée), dont le jeu de résultats a un nombre total de lignes égal au nombre de lignes de la première table multiplié par le nombre de lignes de la deuxième table.

winemain_course
MerlotCardamom Maple Salmon
HouseCardamom Maple Salmon
SangioveseCardamom Maple Salmon
MerlotClassic Macaroni & Cheese
HouseClassic Macaroni & Cheese
SangioveseClassic Macaroni & Cheese
MerlotBaked Teriyaki Chicken
HouseBaked Teriyaki Chicken
SangioveseBaked Teriyaki Chicken
MerlotBlue Cheese Beef Tenderloin
HouseBlue Cheese Beef Tenderloin
SangioveseBlue Cheese Beef Tenderloin

Nous avons obtenu le résultat souhaité. C'est une solution viable pour joindre deux tables lorsque l'objectif est d'obtenir un ensemble de résultats avec toutes les combinaisons possibles de lignes. Cependant, ce n'est pas la meilleure approche.

Les spécialistes du langage SQL préfèrent utiliser le mot-clé explicite CROSS JOIN pour ce type d'opération. Il indique clairement que nous effectuons une jointure croisée de manière intentionnelle et non pas en omettant accidentellement la condition de jointure WHERE, ce qui peut arriver lorsque l'on utilise la syntaxe obsolète pour joindre des tables.

Pour en savoir plus sur les avantages de la nouvelle syntaxe de jonction des tables, consultez notre article, Quelle est la différence entre JOIN et plusieurs tables dans FROM ?

Utilisation de l'opérateur CROSS JOIN

Comme vous l'avez peut-être déjà deviné, la deuxième approche pour obtenir toutes les combinaisons possibles des lignes de deux tables consiste à utiliser l'opérateur CROSS JOIN :

SELECT w.name AS wine, m.name AS main_course
FROM wine w
CROSS JOIN main_course m;

Cette requête produit exactement le même ensemble de résultats que celui présenté précédemment. Cependant, cette syntaxe est préférable, car elle indique clairement l'intention d'effectuer une CROSS JOIN et est plus lisible pour les autres utilisateurs de votre code SQL.

Pour en savoir plus sur les jointures croisées, consultez notre Guide illustré de la jointure croisée SQL.

Utilisation de UNION ou UNION ALL

Il existe d'autres cas d'utilisation pour combiner deux tables sans colonne commune. Comme dans l'exemple mentionné précédemment, vous pouvez souhaiter consolider toutes les informations relatives aux fournisseurs stockées dans plusieurs tables. Dans ce cas, vous ne voulez pas d'un produit cartésien. Alors, comment combiner les tables ?

Dans ce cas, vous utilisez une UNION pour fusionner les informations de plusieurs tables. Techniquement, il ne s'agit pas d'une jointure, mais elle peut s'avérer très pratique pour combiner les lignes de plusieurs tables, comme dans l'exemple ci-dessous.

En termes simples, JOIN combine des données en ajoutant les colonnes d'une table à celles d'une autre table. À l'inverse, UNION combine les données en ajoutant les lignes aux lignes d'un autre tableau.

Ainsi, si nous voulons générer une liste combinée des ID des fournisseurs à partir des tables wine et main_course nous pouvons utiliser la requête SQL suivante :

SELECT w.supplier_id
FROM wine w
UNION
SELECT m.major_supplier_id
FROM main_course m
ORDER BY supplier_id;

Ici, nous sélectionnons d'abord les ID des fournisseurs dans la table wine (colonne supplier_id) et de la table main_course (colonne major_supplier_id) séparément. Ensuite, nous combinons ces lignes en utilisant le mot-clé UNION. Enfin, nous trions le résultat pour plus de commodité :

supplier_id
100
200
300
400
500
600

Notez les points suivants lorsque vous utilisez UNION en SQL :

  • Toutes les déclarations SELECT doivent énumérer le même nombre de colonnes.
  • Les colonnes correspondantes doivent avoir le même type de données.
  • Les colonnes correspondantes peuvent avoir des noms différents, comme c'est le cas dans notre exemple. Par défaut, le nom de la colonne correspondante dans la sortie sera tiré de la première instruction SELECT. Si nécessaire, vous pouvez définir les noms des colonnes résultantes à l'aide du mot-clé AS. Notez que les colonnes de différentes tables doivent être nommées dans le même ordre pour qu'elles correspondent correctement.
  • L'opérateur UNION supprime les doublons du jeu de résultats. Comme vous l'avez peut-être remarqué, l'élément supplier_id 400 se trouvait dans les deux tables, mais il n'apparaît qu'une seule fois dans le jeu de résultats. Si vous ne voulez pas que les doublons soient supprimés, utilisez plutôt l'opérateur UNION ALL:

    SELECT w.supplier_id
    FROM wine w
    UNION ALL
    SELECT m.major_supplier_id
    FROM main_course m
    ORDER BY 1;
    

Le résultat de cette requête inclura le supplier_id 400 deux fois :

supplier_id
100
200
300
400
400
500
600

Si ni CROSS JOIN ni UNION ne s'appliquent à votre cas d'utilisation consistant à combiner deux tables sans colonne commune, consultez cet article contenant des exemples de jointures non-équi. Vous y trouverez peut-être des exemples pertinents.

Il est temps de pratiquer CROSS JOIN et UNION !

Vous en savez maintenant beaucoup sur la combinaison de tables sans colonne commune. Vous êtes donc prêt à répondre à la question suivante : comment combiner deux tables sans colonne commune ? Il s'agit d'une question très courante dans les entretiens d'embauche en SQL !

Si vous souhaitez en savoir plus sur JOIN, consultez la vidéo SQL JOIN Basics de notre série "We Learn SQL" sur YouTube. Vous pouvez également consulter le guide de LearnSQL.fr sur les meilleures façons d'apprendre Les jointures en SQL.

Cependant, vous savez probablement déjà que le chemin le plus court pour devenir un expert SQL est de s'entraîner à écrire des requêtes SQL. LearnSQL.fr propose un cours complet sur Les jointures en SQL avec 93 exercices interactifs. Dans ce cours, vous aurez l'occasion de vous exercer à toutes sortes d'opérations de base sur JOIN, y compris CROSS JOIN, les jointures automatiques, les jointures non équitables et les jointures de plusieurs tables.

Bon apprentissage !