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.
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” :
prenom | nom | ville | date_naissance | total_achat |
---|---|---|---|---|
Léon | Dupuis | Paris | 1983-03-06 | 135 |
Marie | Bernard | Paris | 1993-07-03 | 75 |
Sophie | Dupond | Marseille | 1986-02-22 | 27 |
Marcel | Martin | Paris | 1976-11-24 | 39 |
La table du magasin n°2 est “magasin2_client” :
prenom | nom | ville | date_naissance | total_achat |
---|---|---|---|---|
Marion | Leroy | Lyon | 1982-10-27 | 285 |
Paul | Moreau | Lyon | 1976-04-19 | 133 |
Marie | Bernard | Paris | 1993-07-03 | 75 |
Marcel | Martin | Paris | 1976-11-24 | 39 |
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 :
nom | prenom | ville | date_naissance | total_achat |
---|---|---|---|---|
Marie | Bernard | Paris | 1993-07-03 | 75 |
Marcel | Martin | Paris | 1976-11-24 | 39 |
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.