SQL Serverでは、T-SQL INTERSECT
を使用できます。 左右両方の入力クエリによって出力される個別の行を返す演算子。
構文
構文は次のようになります:
{ <query_specification> | ( <query_expression> ) }
{ INTERSECT }
{ <query_specification> | ( <query_expression> ) }
実際、MicrosoftのドキュメントにはEXCEPT
が含まれています 同じ構文がINTERSECT
に適用されるため、その定義では演算子 およびEXCEPT
。
Microsoftの構文は次のようになります:
{ <query_specification> | ( <query_expression> ) }
{ EXCEPT | INTERSECT }
{ <query_specification> | ( <query_expression> ) }
例
2つのテーブルがあると想像してください。 Cats
およびDogs
。
Cats
+---------+-----------+ | CatId | CatName | |---------+-----------| | 1 | Brush | | 2 | Scarcat | | 3 | Flutter | | 4 | Flutter | +---------+-----------+
Dogs
+---------+-----------+ | DogId | DogName | |---------+-----------| | 1 | Yelp | | 2 | Woofer | | 3 | Brush | | 4 | Brush | +---------+-----------+
Brushという猫がいて、Brushという犬も2匹いることに注意してください。
INTERSECT
を使用できます 演算子は、左と右の両方の入力クエリによって出力される個別の行のみを返します。
つまり、両方のテーブルに表示されるすべての値を返しますが、(複数の行がある場合でも)1つの行のみを返します。したがって、この場合はBrush
を返します。 。
やってみましょう。
SELECT
CatName AS PetName
FROM Cats
INTERSECT
SELECT
DogName AS PetName
FROM Dogs;
結果:
Brush
前述のように、個別の行が返されるため、この場合は1つの行のみが返されます。
これはLEFT SEMI JOIN
として表示されます 実行計画で。
次のようにするのと似ています:
SELECT
DISTINCT CatName
FROM Cats c
WHERE EXISTS (SELECT DogName FROM Dogs d
WHERE c.CatName = d.DogName);
結果:
Brush
INTERSECT
を使用する場合は注意してください 、列の数と順序は、すべてのクエリで同じである必要があります。また、データ型には互換性がなければなりません。それらは実際には同じである必要はありませんが、暗黙の変換によって比較可能である必要があります。
また、DISTINCT
を決定するために列の値を比較する場合 行、2つのNULL
値は等しいと見なされます。
INTERSECT
を使用する場合 分散クエリでは、ローカルサーバーでのみ実行され、リンクサーバーにはプッシュされないため、パフォーマンスに影響を与える可能性があることに注意してください。