sql serverこもごも至る、差集の使い方を詳しく説明する。


概要

なぜ集合演算を使うのですか?
集合演算では、連結クエリやEXISTS/NOT EXISTSよりも便利です。
一括演算(UNION)
集合:2つのセットの集合は、セットAとBのすべての要素を含む集合である。

T-SQLにあります。ユニオン集合演算は、2つのクエリーの入力結果を1つの結果セットにグループ化することができます。一つの行がどの入力セットにも現れると、ユニオン演算の結果にも現れます。T-SQLは以下の2つのオプションをサポートします。
(1)ユニオンALL:重複行は削除されません。

-- union allselect 
country, region, city from hr.Employees
union all
select country, region, city from sales.Customers;
(2)UNION:重複行は削除されます。

-- union
select country, region from hr.Employees
union
select country, region from sales.Customers;
交差演算(INTERSECT)
交差点:2つの集合(集合Aと集合Bと表記)の交差点は、AにもBにも属するすべての要素からなる集合である。

T-SQLでは、INTERSECT集合演算は、2つの入力クエリの結果をインターリーブし、2つのクエリ結果のセットにのみ表示される行を返します。
INTERSECT集合演算は、論理的には、まず2つの入力セットの重複行を削除し、その後、2つのセットの中にしか存在しない行を返します。言い換えれば、1つの行が少なくとも2つの入力セットに1回ある場合、折り返しの結果にはこの行が含まれます。
例えば、下記は従業員の住所であり、また取引先の住所でもある。

-- intersect
select country, region, city from hr.Employees
intersect
select country, region, city from sales.Customers;
ここでは、集合演算が行を比較すると、2つのNULLの値が等しいと判断され、その行の記録に戻るということが必要である。
差集合演算(EXCEPT)
差セット:2つのセット(セットAとセットBと表記)のは、セットAに属するが、セットBのすべての要素からなるセットではない。

T-SQLでは、集合の差はEXCEPT集合演算を用いて実現される。二つの入力クエリの結果セットを操作すると、第一の結果セットに現れますが、第二の結果セットのすべての行は現れません。
EXCEPTは、演算を組み合わせて論理的に2つの入力セットの重複行を削除し、1番目のセットだけに現れ、2番目の結果セットには現れないすべての行を返します。言い換えれば、1つの行は戻ってきてもよく、この行が最初の入力のセットの中に少なくとも1回現れたときだけで、しかも2番目のセットの中には一回も現れていない。
また、UNIONとINTERSECTに比べて、2つの入力セットの順序は最終的な戻り結果に影響します。
例えば、EXCEPT演算によって、Aに属していますが、Bに属さないシーンを簡単に実現できます。以下は社員の抵抗に属しますが、お客様の住所記録ではありません。

-- except 
select country, region, city from hr.Employees
except
select country, region, city from sales.Customers;
集合演算の優先度

SQLは、集合演算の優先度を定義しています。INTERSECTが一番高く、UNIONとEXCEPTが等しいです。
言い換えれば、まずINTERSECTを計算し、左から右への出現順に優先度が同じ演算を順次処理します。

--         
select country, region, city from Production.Suppliers
except
select country, region, city from hr.Employees
intersect
select country, region, city from sales.Customers;
上記のSQLコードは、INTERSECTの優先度がEXCEPTより高いため、まずINTERSECTの交差演算を行います。したがって、このクエリの意味は、従業員の住所と取引先の住所が交差していないサプライヤーの住所を返します。
集合演算の優先度
1.INTERSECT>UNION=EXCEPT
2.まずINTERSECTを計算し、左から右の出現順に優先度の同じ演算を順次処理します。
3.最も優先度の高い括弧は、集合演算の優先度を制御するために使用することができます。
並べ替え関数のOVER文ではORDER BY(SELECT<定数>)を使用してSQL Serverが行の順序を気にする必要がないことを教えられます。
表式を使用して、サポートされていない論理クエリ処理を避ける
集合演算クエリ自体はORDER BY以外の論理クエリ処理段階を持たないが、表式によりこの制限を回避することができる。
解決策とは、まず、集合演算を含むクエリーに基づいて表式を定義し、外部クエリーに表式を適用するために必要な論理クエリー処理です。
(1)例えば、以下の照会は、国ごとに異なる従業員の住所または顧客の住所の数を返します。

select country, COUNT(*) as numlocations
from (select country, region, city from hr.Employees 
union 
select country, region, city from sales.Customers) as Ugroup by country;
(2)例えば、以下の照会は、従業員の住所が3または5の従業員が最近処理した二つの注文を返します。

select empid,orderid,orderdate 
from (select top (2) empid,orderid,orderdate 
 from sales.Orders
 where empid=3
 order by orderdate desc,orderid desc) as D1
union all
select empid,orderid,orderdate 
from (select top (2) empid,orderid,orderdate 
 from sales.Orders
 where empid=5
 order by orderdate desc,orderid desc) as D2;
ここでsql serverを通じて、差集の使い方について詳しく解説した文章を紹介します。もっと関連したsql serverが交差しています。差集の内容は以前の文章を検索してください。または下記の関連記事を引き続きご覧ください。これからもよろしくお願いします。