UNION による結果セットの結合

UNION 演算子を使用すると、2 つ以上の SELECT ステートメントの結果を組み合わせて 1 つの結果セットにできます。UNION を使用して組み合わせる結果セットは、すべて同じ構造を備えている必要があります。列数が同じで、対応する結果セット列は互換性のあるデータ型である必要があります。詳細については、「UNION 使用のガイドライン」を参照してください。

UNION は次のように指定します。

select_statement UNION [ALL] select_statement

たとえば、Table1Table2 はどちらも 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

解説

最初のステートメントは、TableBTableC の和集合 (Union) の重複行が削除されます。その結果セットと TableA の和集合では、重複行が削除されません。2 番目のステートメントでは、TableATableB の和集合には重複行が含まれますが、その後の TableC との和集合では重複行が削除されます。ALL は、この式の最終結果に影響を及ぼしません。

UNION を使用するときは、個別の SELECT ステートメントで独自の ORDER BY 句や COMPUTE 句を指定することはできません。ORDER BY 句または COMPUTE 句は最後の SELECT ステートメントの後に 1 つだけ指定でき、その句は最終的な結果セットの組み合わせに適用されます。GROUP BY 句と HAVING 句は、個別の SELECT ステートメント内でのみ指定できます。