2月 19, 2021
admin
この記事では、SQL Union演算子について深く掘り下げ、その多くの使用方法を例とともに説明し、UnionとUnion Allの違いなどのよくある質問をいくつか紹介します。
現実のデータ要件に対処するには、データ分析を行ったり、新しいデータセットを作成したりできるように、複数のデータソースからの結果セットを組み合 データセットは同じですが、異なるテーブルを参照する可能性があります。, 単一のクエリでデータを結合する方法はありますか? Set演算子は実行可能なオプションですか? これらの共通の課題に対処するために、既存のオペレーターのいくつかをどのように使用できるかを見てみましょう。,n Vs Union All
SQL演算子の構文
selectステートメントでの単純なSQL Union句の使用方法
WHERE句を持つクエリでSQL Unionを使用する方法
UnionでSELECT INTO句を使用する方法
WHERE句とorder by句を持つクエリでSQL Unionを使用する方法
SQL UnionおよびSQL Pivotを使用する方法GROUP句およびHAVING句でSQL Unionを使用する方法
SQL UnionおよびSQL Pivotを使用する方法GROUP句およびHAVING句でSQL Unionを使用する方法
li>
演算子
演算子は、selectステートメント内の一つ以上の式に対して実行されるアクションを定義するシンボルまたはキーワードです。,
Set Operator
SQL ServerのSet演算子の詳細とその使用方法について説明します。
SQL Serverには四つの基本的なSet演算子があります。
- Union
- Union All
- EXCEPT
- INTERSECT
Union
Union演算子は、複数のクエリの結果を組み合わせて、それぞれのクエリの結果を個別の単一の結果セットに組み合わせます。union内のすべてのクエリに属するすべての行が含まれます。 この操作では、さらに二つのクエリを結合し、重複を削除します。,
たとえば、テーブル’A’には1,2と3があり、テーブル’B’には3,4,5があります。,
ユニオン
選択2
ユニオン
選択3
)
ユニオン
(
選択3
ユニオン
選択4
ユニオン
選択5
);
出力では、二つの結果セットからレコードの明確なリストを見ることができます
union ALL
union vs union allを見ると、それらは非常に似ていますが、パフォーマンス結果の観点からいくつかの重要な違いがあります。,
Union演算子は、複数のクエリの結果を、Union内のすべてのクエリに属するすべての行を含む単一の結果セットに結合します。 簡単に言えば、二つ以上の行セットを結合し、重複を保持します。
たとえば、テーブル’A’には1,2と3があり、テーブル’B’には3,4,5があります。,iv>
7
8
9
10
11
12
13
(
SELECT1ID
UNION
選択2
ユニオン
選択3
)
ユニオンすべて
(
選択3
ユニオン
選択4
ユニオン
選択5
);
|
出力には、繰り返しレコードを含むすべての行も表示できます。,>4
5
6
7
8
9
10
11
12
13
(
選択1id
ユニオン
選択2
ユニオン
選択3
)
それぞれ交差
(
選択3
ユニオン
選択4
ユニオン
選択5
);
|
行’3’は二つの結果セットの間で共通です。,
EXCEPT
EXCEPT演算子は、最初の行のうち二番目の行ではない行をリストします。,/div>
4
5
6
7
8
9
10
11
12
13
(
選択1
ユニオン
選択2
ユニオン
選択3
)
除く
(
選択3b
ユニオン
選択4
ユニオン
選択5
);
|
名前をリストします-最初のセットからの共通行。,
注:各テーブルが交差する形状で表されるベン図を使用して集合演算子を視覚化するのは非常に簡単です。 テーブルが重なっているシェイプの交点は、条件が満たされている行です。,各問合せで定義されるolumnは、同じ順序を持つ必要があります
後続のSQL文の行セットは、最初の問合せのデータ型と一致する必要があります
括弧は、同じ文で他のセット演算子を構築することができます
ORDER BY句を持つことができますが、それはSQLの最後の文である必要があります
GROUP BY句とHAVING句は、個々の問合せに適用することができます
注:
- これらのすべてのセット演算子を使用することができます。演算子は重複を削除しますが、union all演算子を除きます。
- 出力列名は最初のクエリiから参照されます。,E.SelectステートメントをSet演算子のいずれかで実行し、各クエリの結果セットには異なる列名がある可能性があるため、SELECTステートメントの結果は操作の最初のクエリの列名を参照します。
- SQL結合は、複数の関連テーブルの列を結合するのに対して、SET演算子は複数のテーブルの行を結合することがよくあります。,
- 式の型が同じで精度、スケール、または長さが異なる場合、結果は式の組み合わせに関する同じ規則に基づいて決定されます
例:
次のT-SQLクエリが準備され、Adventureworks2014データベースに対して実行されます。 AdventireWorks2014データベースのサンプルはこちらからダウンロードできます
-
selectステートメントで単純なSQL Union句を使用する方法
この例では、結果セットには最初のセットと二番目のセットからの別個の行セットが含まれています。,次の例は、ルール1,3&5に基づいています。,
選択1
ユニオン
選択2
ユニオン
選択3
)
ユニオン
(
選択3B
ユニオン
選択4
ユニオン
選択5
)
ユニオンすべて
(
select8c
union
select9
union
select1
)
)t;
出力は、ユニオンとユニオンの組み合わせです括弧を使用するすべての演算子。,
WHERE句を持つクエリでSQL Unionを使用する方法
次の例は、WHERE句とORDER BY句を持つ二つのSELECT文でUnionを使用する方法を示しています。,
The following example is based on the rule 1,2 and 3
|
SELECT P1.ProductModelID,
P1.Name
FROM Production.ProductModel P1
WHERE ProductModelID IN(3, 4)
UNION
SELECT P2.ProductModelID,
P2.,本番環境からの名前
。ProductModel P2
ここでP2。ProductModelID IN(3,4)
ORDER BY P1.Name;
|
SQL UnionでSELECT INTO句を使用する方法
次の例では、新しいdboを作成します。二つの異なる結果セットからの列ProductModelとnameの和集合の最終結果セットを保持する最初のSELECTステートメントでINTO句を使用するダミーテーブル。, この場合、同じテーブルから派生しますが、現実の状況では、これは二つの異なるテーブルにすることもできます。 次の例は、ルール1、2、および4に基づいています。
1
2
3
4
5
6
7
8
9
10
11
12
13
|
存在する場合はテーブルをドロップしますdbo。,dummy;
SELECT P1.ProductModelID,
P1.Name
INTO dummy
FROM Production.ProductModel P1
WHERE ProductModelID IN(3, 4)
UNION
SELECT P2.ProductModelID,
P2.Name
FROM Production.ProductModel P2
WHERE P2.ProductModelID IN(3, 4)
ORDER BY P1.Name;
GO
SELECT *
FROM dbo.,ダミー;
|
WHERE句とORDER BY句を持つクエリでSQL Unionを使用する方法
これは、Union演算子のすべてのselectステートメントでTOP関数または集計関数を使用する場合にのみ可能です
これは、Union演算子のすべてのselectステートメントでTOP関数または集計関数を使用する場合にのみ可能です—– この場合、各結果セットから上位10行がリストされ、Union句を使用して行を結合して最終結果を取得します。 また、order by句がすべてのselectステートメントに配置されていることもわかります。,
1
2
3
4
5
6
7
8
9
10
11
12
13
|
選択します。モデルid,
インクルードします。,Name
FROM
(
SELECT TOP 10 ProductModelID ModelID,
Name
FROM Production.ProductModel
WHERE ProductModelID NOT IN(3, 4)
ORDER BY Name DESC
) a
UNION
SELECT b.ProductModelID,
b.Name
FROM
(
SELECT TOP 10 ProductModelID,
Name
FROM Production.,ProductModel
Where ProductModelID IN(5,6)
ORDER BY Name DESC
)b;
|
どのように次の例では、sql unionおよびsql pivotを使用するために、複数の結果セットを結合しようとしています。 実際の状況では、さまざまな地域または部門の財務番号があり、テーブルの列とデータ型は同じですが、それらを単一の行セットと単一のレポートに入れ, このようなシナリオでは、Union句を使用すると、結果を結合してデータをより意味のあるレポートに変換するのが非常に簡単です。
この例では、ProductModelはTop10、Top100、Top100に分類され、行を集計された値のセットとしてそれぞれの列に変換します。 次の例は、ルール2に基づいています。,/div>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
最大(top10)top10,
最大(top100)top100,
最大(top1000)top100
から
(
カウントを選択します(*)top10,
0top100,
0top1000
生産から。,ProductModel
WHERE ProductModelID < 10
UNION
SELECT 0,
COUNT(*),
0
FROM Production.ProductModel
WHERE ProductModelID > 11
AND ProductModelID < 100
UNION
SELECT 0,
0,
COUNT(*)
FROM Production.,ProductModel
WHERE ProductModelID>101
)T;
|
NULL値は、セット演算子では非常に重要であり、セカンドクラスのデータベース市民として扱われます。 Nullは一意であると見なされ、同じ列にNULLがある場合、それらは同一と見なされるため、その場合、実際にNULLをNULLと比較して等価性を取得します。 次の例では、NULL値の使用を参照してください。 この場合、集計関数maxで操作されます。,
14
15
16
17
18
19
20
21
22
最大(top10)top10、
最大(top100)top100、
最大(top1000)top100
から
(
カウントを選択します(*)top10、
null top100、
null top1000
生産から。,ProductModel
WHERE ProductModelID < 10
UNION
SELECT NULL,
COUNT(*),
NULL
FROM Production.ProductModel
WHERE ProductModelID > 11
AND ProductModelID < 100
UNION
SELECT NULL,
NULL,
COUNT(*)
FROM Production.,ProductModel
Where ProductModelID>101
)T;
|