Executando semijunções com EXCEPT e INTERSECT

Uma semijunção retorna linhas da primeira entrada se tiver, no mínimo, uma linha de correspondência na segunda entrada. Uma antijunção retorna linhas da primeira entrada se não há nenhuma linha de correspondência na segunda entrada. Você usa os operadores EXCEPT e INTERSECT para realizar semijunções e antijunções. Esses operadores permitem comparar os resultados de duas ou mais instruções SELECT e retornar valores distintos. O operador EXCEPT retorna qualquer valor distinto da consulta no lado esquerdo do operador EXCEPT que não seja retornado também pela consulta no lado direito. INTERSECT retorna qualquer valor distinto retornado pela consulta no lado esquerdo e no lado direito do operador INTERSECT. Conjuntos de resultados que são comparados usando EXCEPT ou INTERSECT devem todos ter a mesma estrutura. Devem ter o mesmo número de colunas e as colunas de conjuntos de resultados correspondentes devem ter tipos de dados compatíveis. Para obter mais informações, consulte EXCEPT e INTERSECT (Transact-SQL).

Considere as tabelas TableA, TableBe TableC com os dados a seguir nas suas respectivas colunas intcol1.

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

Usando EXCEPT, a consulta a seguir retorna valores distintos da consulta no lado esquerdo do operando EXCEPT, os quais também não são encontrados na consulta no lado direito.

SELECT * FROM TableA EXCEPT SELECT * FROM TableB

Conjunto de resultados.

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

(1 row(s) affected)

Usando INTERSECT, essa consulta retorna valores distintos que são retornados pela consulta nos lados esquerdo e direito do operador INTERSECT.

SELECT * FROM TableA INTERSECT SELECT * FROM TableB

Conjunto de resultados.

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

(4 row(s) affected)

O operador INTERSECT tem precedência em relação ao EXCEPT. Por exemplo, a consulta a seguir usa ambos os operadores:

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

Conjunto de resultados.

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

(4 row(s) affected)