UNION による結果セットの結合
UNION 演算子を使用すると、2 つ以上の SELECT ステートメントの結果を組み合わせて 1 つの結果セットにできます。UNION を使用して組み合わせる結果セットは、すべて同じ構造を備えている必要があります。列数が同じで、対応する結果セット列は互換性のあるデータ型である必要があります。詳細については、「UNION 使用のガイドライン」を参照してください。
UNION は次のように指定します。
select_statement UNION [ALL] select_statement
たとえば、Table1 と Table2 はどちらも 2 列構造だとします。
TABLE1 |
|
|
TABLE2 |
|
COLUMNA |
COLUMNB |
|
COLUMNC |
COLUMND |
CHAR(4) |
INT |
|
CHAR(4) |
INT |
------- |
--- |
|
------- |
--- |
ABC |
1 |
|
GHI |
3 |
DEF |
2 |
|
JKL |
4 |
GHI |
3 |
|
MNO |
5 |
次のクエリにより、2 つのテーブル間の UNION が作成されます。
SELECT * FROM Table1
UNION
SELECT * FROM Table2
次の結果セットが返されます。
ColumnA ColumnB
------- --------
abc 1
def 2
ghi 3
jkl 4
mno 5
UNION の結果セット列名は、UNION 内の最初の SELECT ステートメントの結果セット列名と同じです。その他の SELECT ステートメントの結果セット列名は無視されます。
UNION 演算子は、既定では結果セットから重複行を削除します。ALL を使用すると、すべての行が結果に含まれ、重複行は削除されません。
UNION 操作の厳密な結果は、インストール時に選択した照合順序および ORDER BY 句によって変わります。照合順序の違いによる影響の詳細については、「照合順序の使用」を参照してください。
Transact-SQL ステートメントでは、UNION 演算子をいくつでも使用できます。次に例を示します。
SELECT * FROM TableA
UNION
SELECT * FROM TableB
UNION
SELECT * FROM TableC
UNION
SELECT * FROM TableD
SQL Server 2005 では、UNION 演算子を使用したステートメントが左から右に評価されます。かっこを使用して、評価の順序を指定できます。たとえば、次のステートメントは結果が異なります。
/* First statement. */
SELECT * FROM TableA
UNION ALL
( SELECT * FROM TableB
UNION
SELECT * FROM TableC
)
GO
/* Second statement. */
(SELECT * FROM TableA
UNION ALL
SELECT * FROM TableB
)
UNION
SELECT * FROM TableC)
GO
解説
最初のステートメントは、TableB と TableC の和集合 (Union) の重複行が削除されます。その結果セットと TableA の和集合では、重複行が削除されません。2 番目のステートメントでは、TableA と TableB の和集合には重複行が含まれますが、その後の TableC との和集合では重複行が削除されます。ALL は、この式の最終結果に影響を及ぼしません。
UNION を使用するときは、個別の SELECT ステートメントで独自の ORDER BY 句や COMPUTE 句を指定することはできません。ORDER BY 句または COMPUTE 句は最後の SELECT ステートメントの後に 1 つだけ指定でき、その句は最終的な結果セットの組み合わせに適用されます。GROUP BY 句と HAVING 句は、個別の SELECT ステートメント内でのみ指定できます。