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
を使用する場合 分散クエリでは、ローカルサーバーでのみ実行され、リンクサーバーにはプッシュされないため、パフォーマンスに影響を与える可能性があることに注意してください。