UNION
備考
UNION または UNION ALL を使用する SELECT ステートメントを使って、複数の SELECT クエリから 1 つの結果テーブルを取得できます。UNION クエリは、2 つ以上のデータ ソースに含まれる類似した情報を結合して 1 つにするのに適しています。
UNION を使用すると、重複行が削除されます。UNION ALL を使用すると、重複行が保持されます。重複行を削除する必要がない限り、UNION ALL オプションの使用をお勧めします。
UNION では、PSQL エンジンは結果セット全体を整列させるため、テーブルが大きいと処理に数分かかることがあります。UNION ALL では、ソートは不要になります。
PSQL データベース エンジンは、UNION ステートメントでの LONGVARBINARY 列の使用をサポートしていません。UNION ステートメントでは、LONGVARCHAR および NLONGVARCHAR は 65500 バイトまでに制限されています。演算子 UNION は、1 つ以上のビューを参照する SQL ステートメントに適用することはできません。
UNION に含まれる 2 つのクエリ スペックは互換性がなければなりません。それぞれのクエリは同数の列を持ち、それらの列は互換性のあるデータ型である必要があります。
UNION キーワードの後にくる SELECT ステートメントの ORDER BY 句で、最初の SELECT リストにある列名を使用できます。また、序数を使って目的の列を示すこともできます。たとえば、次のステートメントは有効です。
SELECT c1, c2, c3 FROM t1 UNION SELECT c4, c5, c6 FROM t2 ORDER BY t1.c1, t1.c2, t1.c3
SELECT c1, c2, c3 FROM t1 UNION SELECT c4, c5, c6 FROM t2 ORDER BY 1, 2, 3
また、列名のエイリアスも使用できます。
SELECT c1 x, c2 y, c3 z FROM t1 UNION SELECT c1, c2, c3 FROM t2 ORDER BY x, y, z
SELECT c1 x, c2 y, c3 z FROM t1 a UNION SELECT c1, c2, c3 FROM t1 b ORDER BY a.x, a.y, a.z
エイリアスは、クエリ内のどのテーブル名、列名とも異なっている必要があります。
例
次の例では、名字が "M" で始まるか、成績評価点平均が 4.0 の生徒の ID 番号の一覧が示されます。結果テーブルに重複する行は含まれません。
SELECT Person.ID from Person WHERE Last_name LIKE 'M%' UNION SELECT Student.ID FROM Student WHERE Cumulative_GPA = 4.0
次の例では、重複行を含めた person テーブルおよび faculty テーブルの列 ID が抽出されます。
SELECT person.id FROM person UNION all SELECT faculty.id from faculty
次の例では、名字が "M" で始まるか、成績評価点平均が 4.0 の生徒の ID 番号の一覧が示されます。結果テーブルには重複行が含まれず、最初の列に従って結果セットが並べられます。
SELECT Person.ID FROM Person WHERE Last_name LIKE M%' UNION SELECT Student.ID FROM Student WHERE Cumulative_GPA = 4.0 order by 1
NULL スカラー関数を使用すると、UNION 選択リストに親選択リストとは異なる数のエントリを持たせることができます。これを行うには、CONVERT 関数を使用して NULL を強制的に正しい型に変換する必要があります。
CREATE TABLE t1 (c1 INTEGER, c2 INTEGER)
INSERT INTO t1 VALUES (1,1)
CREATE TABLE t2 (c1 INTEGER)
INSERT INTO t2 VALUES (2)
select c1, c2 from t1 UNION SELECT c1, convert(null(),sql_integer) FROM t2
関連項目