Realizar semicombinaciones con EXCEPT e INTERSECT

Una semicombinación devuelve filas de la primera entrada si hay al menos una fila coincidente en la segunda entrada. Una anticombinación devuelve filas de la primera entrada si no hay ninguna fila coincidente en la segunda entrada. Los operadores EXCEPT e INTERSECT se utilizan para realizar semicombinaciones y anticombinaciones. Estos operadores permiten comparar los resultados de dos o más instrucciones SELECT y devolver valores distintos. El operador EXCEPT devuelve los valores distintos de la consulta incluida en la parte izquierda del operador EXCEPT, que además no son devueltos por la consulta de la parte derecha. INTERSECT devuelve los valores distintos que devuelven tanto la consulta de la parte izquierda como la consulta de la parte derecha del operador INTERSECT. Los conjuntos de resultados que se comparan con EXCEPT o INTERSECT deben tener la misma estructura. Deben tener el mismo número de columnas y las columnas del conjunto de resultados deben tener tipos de datos compatibles. Para obtener más información, vea EXCEPT e INTERSECT (Transact-SQL).

Supongamos que utilizamos las tablas TableA, TableB y TableC con los siguientes datos en sus columnas intcol1 respectivas.

TableA (col1 int)

TableB (col1 int)

TableC (col1 int)

NULL

NULL

2

NULL

1

2

NULL

3

2

1

4

4

2

4

4

2

2

3

4

4

Si se utiliza EXCEPT, la consulta siguiente devuelve los valores distintos de la consulta situada a la izquierda del operando EXCEPT, que además no existen en la consulta de la derecha.

SELECT * FROM TableA EXCEPT SELECT * FROM TableB

El conjunto de resultados es el siguiente.

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

(1 row(s) affected)

Si se utiliza INTERSECT, esta consulta devuelve los valores distintos que devuelven tanto la consulta de la parte izquierda como la consulta de la parte derecha del operador INTERSECT.

SELECT * FROM TableA INTERSECT SELECT * FROM TableB

El conjunto de resultados es el siguiente.

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

(4 row(s) affected)

El operador INTERSECT tiene prioridad sobre EXCEPT. Por ejemplo, en la siguiente consulta se utilizan los dos operadores:

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

El conjunto de resultados es el siguiente.

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

(4 row(s) affected)