EXCEPT と INTERSECT による半結合の実行

Semi-Join は、最初の入力の中に 2 番目の入力に一致する行がある場合に、該当する行を返します。Anti-Join は、最初の入力の中に 2 番目の入力に一致する行がない場合に、該当する行を返します。Semi-Join と Anti-Join を実行するには、EXCEPT 演算子と INTERSECT 演算子をそれぞれ使用します。これらの演算子を使用すると、複数の SELECT ステートメントの結果を比較し、重複しない値を返すことができます。EXCEPT 演算子では、EXCEPT 演算子の左辺のクエリから返される結果のうち、右辺のクエリでも返される結果を除いて、重複しない値が返されます。INTERSECT 演算子では、INTERSECT 演算子の左辺と右辺の両方のクエリで返される結果を合わせて、その中から重複しない値が返されます。EXCEPT または INTERSECT を使用して比較される結果セットは、すべて同じ構造である必要があります。列数が同じで、対応する結果セット列は互換性のあるデータ型である必要があります。詳細については、「EXCEPT および INTERSECT (Transact-SQL)」を参照してください。

TableATableB、および TableC の各テーブルがあり、各テーブルの int 型の列 col1 に次のデータが含まれるテーブルについて考えてみます。

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 を使用する次のクエリは、EXCEPT オペランドの左辺のクエリから返され、右辺のクエリからは返されなかった、重複しない値が返されます。

SELECT * FROM TableA EXCEPT SELECT * FROM TableB

以下に結果セットを示します。

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

(1 row(s) affected)

INTERSECT を使用する次のクエリは、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)