集合演算子

集合演算子を使用すると、クエリを組み合わせることができます。

このトピックの内容:

一般的な構文

[ ( ] <query> [ ) ] { INTERSECT | { MINUS | EXCEPT } | UNION [ ALL ] } [ ( ] <query> [ ) ]
[ ORDER BY ... ]
[ LIMIT ... ]

一般的な使用上の注意

  • 各クエリ自体にクエリ演算子を含めると、任意の数のクエリ式をセット演算子と組み合わせることができます。

  • ORDER BY 句と LIMIT / FETCH 句は、集合演算子の結果に適用されます。

  • これらの演算子を使用する場合:

    • 各クエリが同じ数の列を選択することを確認してください。

    • 各列のデータ型が、異なるソースからの行全体で一貫していることを確認してください。以下の セクションの例の1つは、データ型が一致しない場合の潜在的な問題と解決策を示しています。

    • 一般に、列の「意味」とデータ型は一致する必要があります。以下は、望ましい結果を生成しません。

      SELECT LastName, FirstName FROM employees
      UNION ALL
      SELECT FirstName, LastName FROM contractors;
      

      アスタリスクを使用してテーブルのすべての列を指定すると、エラーのリスクが増加します。次に例を示します。

      SELECT * FROM table1
      UNION ALL
      SELECT * FROM table2;
      

      テーブルの列数が同じであるが、列の順序が同じでない場合、クエリ結果は正確でない可能性があります。

    • 出力列の名前は、最初のクエリ列の名前に基づいています。例えば、次のクエリ

      SELECT LastName, FirstName FROM employees
      UNION ALL
      SELECT FirstName, LastName FROM contractors;
      

      は次のクエリであるように動作します。

      SELECT LastName, FirstName FROM employees
      UNION ALL
      SELECT FirstName AS LastName, LastName AS FirstName FROM contractors;
      

INTERSECT

あるクエリの結果セットから行を返します。この行は別のクエリの結果セットにも表示され、重複を排除します。

構文

SELECT ...
INTERSECT
SELECT ...

MINUS , EXCEPT

別のクエリの結果セットに表示される1つのクエリの結果セットから行を削除し、重複を排除します。

MINUS および EXCEPT キーワードは同じ意味を持ち、同じ意味で使用できます。

構文

SELECT ...
MINUS
SELECT ...

SELECT ...
EXCEPT
SELECT ...

UNION [ ALL ]

2つのクエリの結果セットを結合します。

  • UNION は、重複排除と組み合わせます。

  • UNION ALL は、重複排除なしで結合します。

デフォルトは UNION (重複排除)です。

構文

SELECT ...
UNION [ ALL ]
SELECT ...

この例は、 UNION 演算子の基本的な使用法を示しています。また、データ型が一致しない場合の潜在的な問題を示し、ソリューションを提供します。

テーブルを作成し、いくつかのデータを挿入することから始めます。

CREATE TABLE t1 (v VARCHAR);
CREATE TABLE t2 (i INTEGER);
INSERT INTO t1 (v) VALUES ('Adams, Douglas');
INSERT INTO t2 (i) VALUES (42);

異なるデータ型で UNION 操作を実行します。

SELECT v FROM t1    -- VARCHAR
UNION
SELECT i FROM t2    -- INTEGER
;

出力:

100038 (22018): Numeric value 'Adams, Douglas' is not recognized

次に、明示的なキャストを使用して、入力を互換性のある型に変換します。

SELECT v::VARCHAR FROM t1
UNION
SELECT i::VARCHAR FROM t2;

出力:

+----------------+
| V::VARCHAR     |
|----------------|
| Adams, Douglas |
| 42             |
+----------------+
最上部に戻る