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)
Vedere anche