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.