Esecuzione di semi-join con gli operatori EXCEPT e INTERSECT

Un semi join restituisce righe dal primo input se è presente almeno una riga corrispondente nel secondo input. Un anti join restituisce righe dal primo input se non sono presenti righe corrispondenti nel secondo input. Gli operatori EXCEPT e INTERSECT vengono utilizzati per eseguire semi join e anti join. Questi operatori consentono di confrontare i risultati di due o più istruzioni SELECT e di ottenere valori distinti. EXCEPT restituisce tutti i valori distinti della query a sinistra dell'operatore EXCEPT che non sono restituiti dalla query sul lato destro. INTERSECT restituisce tutti i valori distinti restituiti da entrambe le query a sinistra e a destra dell'operatore INTERSECT. I set di risultati confrontati attraverso l'operatore EXCEPT o INTERSECT devono avere tutti la stessa struttura, ovvero devono includere lo stesso numero di colonne e i tipi di dati delle colonne corrispondenti dei set di risultati devono essere compatibili tra di loro. Per ulteriori informazioni, vedere EXCEPT e INTERSECT (Transact-SQL).

Si considerino ad esempio le tabelle TableA, TableB e TableC con i dati seguenti nelle rispettive colonne di tipo intcol1.

TableA (int col1)

TableB (int col1)

TableC (int col1)

NULL

NULL

2

NULL

1

2

NULL

3

2

1

4

4

2

4

4

2

2

3

4

4

Utilizzando EXCEPT, la query seguente restituisce tutti i valori distinti della query a sinistra dell'operando EXCEPT che non sono inclusi nella query di destra.

SELECT * FROM TableA EXCEPT SELECT * FROM TableB

Set di risultati:

Col1       
----------- 
2

(1 row(s) affected)

Utilizzando INTERSECT, la query restituisce tutti i valori distinti restituiti dalle query a sinistra e a destra dell'operatore INTERSECT.

SELECT * FROM TableA INTERSECT SELECT * FROM TableB

Set di risultati:

Col1       
----------- 
NULL
1
3
4

(4 row(s) affected)

L'operatore INTERSECT ha la precedenza sull'operatore EXCEPT. Nella query seguente vengono ad esempio utilizzati entrambi gli operatori:

SELECT * FROM TableA EXCEPT SELECT * FROM TableB INTERSECT SELECT * FROM TableC

Set di risultati:

Col1       
----------- 
NULL
1
2
3

(4 row(s) affected)