Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Fonctionnement d'INTERSECT dans SQL Server

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.