Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come funziona INTERSECT in SQL Server

In SQL Server è possibile utilizzare T-SQL INTERSECT per restituire righe distinte che vengono emesse dalle query di input sinistra e destra.

Sintassi

La sintassi è questa:

{ <query_specification> | ( <query_expression> ) }   
{ INTERSECT }  
{ <query_specification> | ( <query_expression> ) }

In realtà, la documentazione Microsoft include EXCEPT operatore nella sua definizione, poiché la stessa sintassi si applica a INTERSECT e EXCEPT .

La sintassi Microsoft è la seguente:

{ <query_specification> | ( <query_expression> ) }   
{ EXCEPT | INTERSECT }  
{ <query_specification> | ( <query_expression> ) }

Esempio

Immagina di avere due tavoli; Cats e Dogs .

Cats

+---------+-----------+
| CatId   | CatName   |
|---------+-----------|
| 1       | Brush     |
| 2       | Scarcat   |
| 3       | Flutter   |
| 4       | Flutter   |
+---------+-----------+

Dogs

+---------+-----------+
| DogId   | DogName   |
|---------+-----------|
| 1       | Yelp      |
| 2       | Woofer    |
| 3       | Brush     |
| 4       | Brush     |
+---------+-----------+

Nota che c'è un gatto chiamato Brush e ci sono anche due cani chiamati Brush.

Possiamo usare il INTERSECT per restituire solo le righe distinte che vengono emesse dalle query di input sinistra e destra.

In altre parole, restituirà tutti i valori che appaiono in entrambe le tabelle, ma restituirà solo una riga (anche se sono presenti più righe). Pertanto, nel nostro caso restituirà Brush .

Facciamolo.

SELECT 
    CatName AS PetName
FROM Cats
INTERSECT
SELECT 
    DogName AS PetName
FROM Dogs;

Risultato:

Brush

Come accennato, restituisce righe distinte, quindi in questo caso viene restituita solo una riga.

Questo appare come un LEFT SEMI JOIN nel piano di esecuzione.

È simile a fare quanto segue:

SELECT 
    DISTINCT CatName
FROM Cats c 
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);

Risultato:

Brush

Nota che quando usi INTERSECT , il numero e l'ordine delle colonne devono essere gli stessi in tutte le query. Inoltre, i tipi di dati devono essere compatibili. In realtà non devono essere gli stessi, ma devono essere confrontabili tramite la conversione implicita.

Inoltre, quando si confrontano i valori delle colonne per determinare DISTINCT righe, due NULL i valori sono considerati uguali.

Se intendi utilizzare INTERSECT nelle query distribuite, tieni presente che viene eseguito solo sul server locale e non inviato al server collegato e ciò potrebbe quindi influire sulle prestazioni.