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
関連項目