Puoi usare T-SQL EXCEPT
operatore in SQL Server per restituire righe distinte dalla query di input di sinistra che non vengono restituite dalla query di input di destra.
Sintassi
La sintassi è questa:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT }
{ <query_specification> | ( <query_expression> ) }
In realtà, la documentazione Microsoft include INTERSECT
operatore nella sua definizione, poiché la stessa sintassi si applica a EXCEPT
e INTERSECT
.
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 | +---------+-----------+
Possiamo usare EXCEPT
per restituire solo le righe distinte dalla query di input di sinistra che non vengono emesse dalla query di input di destra.
Ecco un esempio.
SELECT CatName FROM Cats
EXCEPT
SELECT DogName FROM Dogs;
Risultato:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Quindi otteniamo solo i valori che appaiono in Cats
tabella che non compare anche in Dogs
tavolo. Come accennato, restituisce righe distinte, quindi viene restituita solo una riga per Flutter
.
Possiamo anche cambiarlo e inserire i Dogs
tabella a sinistra e Cats
a destra.
SELECT DogName FROM Dogs
EXCEPT
SELECT CatName FROM Cats;
Risultato:
+-----------+ | DogName | |-----------| | Woofer | | Yelp | +-----------+
Il EXCEPT
appare come un LEFT ANTI SEMI JOIN
nel piano di esecuzione.
Quindi il nostro primo esempio è simile al seguente:
SELECT
DISTINCT CatName
FROM Cats c
WHERE NOT EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
Risultato:
+-----------+ | CatName | |-----------| | Flutter | | Scarcat | +-----------+
Nota che quando usi EXCEPT
, 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 EXCEPT
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.