Dans SQL Server, vous pouvez utiliser le T-SQL INTERSECT
pour renvoyer des lignes distinctes qui sont générées à la fois par les requêtes d'entrée gauche et droite.
Syntaxe
La syntaxe ressemble à ceci :
{ <query_specification> | ( <query_expression> ) }
{ INTERSECT }
{ <query_specification> | ( <query_expression> ) }
En fait, la documentation Microsoft inclut le EXCEPT
opérateur dans sa définition, car la même syntaxe s'applique à INTERSECT
et EXCEPT
.
La syntaxe Microsoft ressemble à ceci :
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }
Exemple
Imaginez que vous avez deux tables; Cats
et Dogs
.
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Brush | | 2 | Scarcat | | 3 | Flutter | | 4 | Flutter | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Yelp | | 2 | Woofer | | 3 | Brush | | 4 | Brush | +---------+-----------+
Notez qu'il y a un chat appelé Brush et il y a aussi deux chiens appelés Brush.
Nous pouvons utiliser le INTERSECT
pour renvoyer uniquement les lignes distinctes générées par les requêtes d'entrée gauche et droite.
En d'autres termes, il renverra toutes les valeurs qui apparaissent dans les deux tables, mais il ne renverra qu'une seule ligne (même s'il y en a plusieurs). Par conséquent, dans notre cas, il renverra Brush
.
Allons-y.
SELECT
CatName AS PetName
FROM Cats
INTERSECT
SELECT
DogName AS PetName
FROM Dogs;
Résultat :
Brush
Comme mentionné, il renvoie des lignes distinctes, donc une seule ligne est renvoyée dans ce cas.
Cela apparaît comme un LEFT SEMI JOIN
dans le plan d'exécution.
Cela revient à faire ce qui suit :
SELECT
DISTINCT CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Résultat :
Brush
Notez que lors de l'utilisation de INTERSECT
, le nombre et l'ordre des colonnes doivent être les mêmes dans toutes les requêtes. De plus, les types de données doivent être compatibles. Ils ne doivent pas nécessairement être identiques, mais ils doivent être comparables par conversion implicite.
Aussi, lors de la comparaison des valeurs de colonne pour déterminer DISTINCT
lignes, deux NULL
les valeurs sont considérées comme égales.
Si vous avez l'intention d'utiliser INTERSECT
dans les requêtes distribuées, notez qu'il n'est exécuté que sur le serveur local et non poussé vers le serveur lié, et cela pourrait donc affecter les performances.