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

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)

参照

概念

UNION、EXCEPT、および INTERSECT と他の Transact-SQL ステートメントとの併用

ヘルプおよび情報

SQL Server 2005 の参考資料の入手