SQL INTERSECT

La commande SQL INTERSECT permet d’obtenir l’intersection des résultats de 2 requêtes. Cette commande permet donc de récupérer les enregistrements communs à 2 requêtes. Cela peut s’avérer utile lorsqu’il faut trouver s’il y a des données similaires sur 2 tables distinctes.

A savoir : pour l’utiliser convenablement il faut que les 2 requêtes retourne le même nombre de colonnes, avec les mêmes types et dans le même ordre.

Compatibilité : PostgreSQL, SQL Server, Oracle et SQLite. Pas disponible sous MySQL, mais il existe une alternative présentée sur cette page.

Syntaxe

La syntaxe à adopter pour utiliser cette commande est la suivante :

SELECT * FROM `table1`
INTERSECT
SELECT * FROM `table2`

Dans cet exemple, il faut que les 2 tables soient similaires (mêmes colonnes, mêmes types et même ordre). Le résultat correspondra aux enregistrements qui existent dans table1 et dans table2.

Schéma explicatif

L’intersection de 2 ensembles A et B correspond aux éléments qui sont présent dans A et dans B, et seulement ceux-là. Cela peut être représenté par un schéma explicatif simple ou l’intersection de A et B correspond à la zone en bleu.

Intersection de 2 ensembles

Intersection de 2 ensembles

Exemple

Prenons l’exemple de 2 magasins qui appartiennent au même groupe. Chaque magasin possède sa table de clients.

La table du magasin n°1 est « magasin1_client » :

prenomnomvilledate_naissancetotal_achat
LéonDupuisParis1983-03-06135
MarieBernardParis1993-07-0375
SophieDupondMarseille1986-02-2227
MarcelMartinParis1976-11-2439

La table du magasin n°2 est « magasin2_client » :

prenomnomvilledate_naissancetotal_achat
MarionLeroyLyon1982-10-27285
PaulMoreauLyon1976-04-19133
MarieBernardParis1993-07-0375
MarcelMartinParis1976-11-2439

Pour obtenir la liste des clients qui sont présents de façon identiques dans ces 2 tables, il est possible d’utiliser la commande INTERSECT de la façon suivante:

SELECT * FROM `magasin1_client`
INTERSECT
SELECT * FROM `magasin2_client`

Résultat :

nomprenomvilledate_naissancetotal_achat
MarieBernardParis1993-07-0375
MarcelMartinParis1976-11-2439

Le résultat présente 2 enregistrements, il s’agit des clients qui sont à la fois dans la table « magasin1_client » et dans la table « magasin2_client ». Sur certains systèmes une telle requête permet de déceler des erreurs et d’enregistrer seulement à un seul endroit la même information.

Alternative pour MySQL

MySQL ne propose malheureusement pas cette commande SQL, heureusement le fonctionnement de cette requête peut-être simulé grâce à une petite astuce. La requête SQL ci-dessous est l’alternative à INTERSECT :

SELECT DISTINCT value FROM `table1`
WHERE value IN (
  SELECT value 
  FROM `table2`
);

A noter : la colonne « value » est à remplacer par la colonne de votre choix. La commande DISTINCT n’est pas obligatoire, mais est la plupart du temps utile pour éviter d’afficher plusieurs fois les mêmes valeurs.

Partager