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