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

Come funziona EXCEPT in SQL Server

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.