Выполнение полусоединений с помощью операторов EXCEPT и INTERSECT

Полусоединение возвращает строки из первого входа, если во втором входе существует по меньшей мере хотя бы одна совпадающая строка. Антисоединение возвращает строки из первого входа, если во втором входе отсутствуют совпадающие строки. Для выполнения полусоединений и антисоединений используйте операторы EXCEPT и INTERSECT. Эти операторы позволяют сравнивать результаты двух или более инструкций SELECT и возвращать индивидуальные значения. Оператор EXCEPT возвращает все уникальные значения из запроса слева от оператора, которые не возвращаются запросом справа от оператора. Оператор INTERSECT возвращает все уникальные значения, возвращаемые как запросом слева, так и запросом справа от оператора INTERSECT. Результирующие наборы, сравниваемые операторами EXCEPT или INTERSECT, должны иметь одинаковую структуру. У них должно быть одинаковое количество столбцов, а в соответствующих столбцах результирующих наборов должны содержаться совместимые типы данных. Дополнительные сведения см. в разделе EXCEPT и INTERSECT (Transact-SQL).

Рассмотрим таблицы TableA, TableB и TableC со следующими данными в столбцах col1 типа int.

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

Следующий запрос с оператором EXCEPT возвращает все уникальные значения слева от оператора, которые отсутствуют в запросе справа.

SELECT * FROM TableA EXCEPT SELECT * FROM TableB

Ниже приводится результирующий набор.

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

(1 row(s) affected)

Следующий запрос с оператором INTERSECT возвращает все уникальные значения, возвращаемые как запросом слева, так и запросом справа от оператора.

SELECT * FROM TableA INTERSECT SELECT * FROM TableB

Ниже приводится результирующий набор.

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

(4 row(s) affected)

Оператор INTERSECT получает больший приоритет, чем EXCEPT. Например, в следующем запросе используются оба оператора:

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

Ниже приводится результирующий набор.

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

(4 row(s) affected)