メニュー
Amazon Redshift
データベース開発者ガイド (API Version 2012-12-01)

UNION、INTERSECT、または EXCEPT

UNION、INTERSECT、または EXCEPT セット演算子は、2 つの個別のクエリ式の比較とマージに使われます。たとえば、ウェブサイトで販売者と購入者の両方を兼ねているユーザーを知りたい場合で、そのユーザーが個別の列またはテーブルに保存されているときは、この 2 種類のユーザーの積集合を求めます。購入者ではあるが販売者ではないウェブユーザーがだれかを知りたい場合は、EXCEPT 演算子を使って、2 つユーザーリストのを見つけることができます。役割とは無関係に、すべてのユーザーのリストを作成する場合、UNION 演算子を使用できます。

構文

Copy
query { UNION [ ALL ] | INTERSECT | EXCEPT | MINUS } query

Parameters

query

UNION、INTERSECT、または EXCEPT 演算子の後に続く 2 番目のクエリ式に、SELECT リストの形式で対応するクエリ式。2 つの式は、互換性のあるデータ型の出力列を同数含んでいる必要があります。そうでない場合、2 つの結果セットの比較とマージはできません。データ型の複数のカテゴリ間で黙示的な変換を許可しない演算を設定します。詳細については「型の互換性と変換」を参照してください。

クエリ式の数を上限なしに含むクエリを構築して、そのクエリを任意の組み合わせで UNION、INTERSECT、および EXCEPT 演算子に関連付けることができます。例えば、テーブル T1、T2、および T3 に互換性のある列セットが含まれていると想定した場合、次のクエリ構造は有効です。

Copy
select * from t1 union select * from t2 except select * from t3 order by c1;
UNION

行が片方の式から生成されたか、両方の式から生成されたかにかかわらず、2 つのクエリ式からの行を返す演算を設定します。

INTERSECT

2 つのクエリ式から生成される行を返す演算を設定します。両方の式によって返されない行は破棄されます。

EXCEPT | MINUS

2 つのクエリ式の一方から生成される行を返す演算を設定します。結果を制限するため、行は最初の結果テーブルに存在し、2 番目のテーブルには存在しない必要があります。MINUS と EXCEPT はまったく同じ意味です。

ALL

ALL キーワードは、UNION が生成する重複行を保持します。ALL キーワードを使用しないよう場合のデフォルトの動作は、このような重複を破棄します。INTERSECT ALL、EXCEPT ALL、および MINUS ALL はサポートされません。

セット演算の評価の順番

UNION および EXCEPT セット演算子は左結合です。優先順位の決定でカッコを指定しなかった場合、これらのセット演算子の組み合わせは、左から右に評価されます。

Copy
select * from t1 union select * from t2 except select * from t3 order by c1;

例えば、次のクエリでは、T1 と T2 の UNION が最初に評価され、次に UNION の結果に対して、EXCEPT 演算が実行されます。

同じクエリ内で演算子の組み合わせを使用した場合、INTERSECT 演算子は UNION および EXCEPT よりも優先されます。 例えば、次のクエリは T2 と T3 の積集合を評価し、その結果を T1 を使って結合します。

Copy
select * from t1 union select * from t2 intersect select * from t3 order by c1;

カッコを追加することで、評価の順番を変更することができます。

Copy
(select * from t1 union select * from t2) intersect (select * from t3) order by c1;

次のケースでは、T1 と T2 の結合結果と T3 の積集合を求めます。このクエリでは異なる結果が生成されます。

使用に関する注意事項

  • セット演算クエリの結果で返される列名は、最初のクエリ式のテーブルからの列名 (またはエイリアス) です。これらの列名は、列内の値はセット演算子の両方のテーブルから生成されるという点で誤解を生む可能性があるため、結果セットには意味のあるエイリアスを付けることをお勧めします。

  • セット演算子より前に記述されたクエリ式には、ORDER BY 句を含めないでください。ORDER BY 句は、セット演算子を含むクエリの最後に使用することで、意味のあるソート結果が得られます。この場合、ORDER BY 句は、すべてのセット演算の最終結果に適用されます。最も外側のクエリには、標準の LIMIT 句および OFFSET 句を含めることもできます。

  • LIMIT 句と OFFSET 句は、セット演算の中間結果によって返される行数を制限するための手段としてはサポートされていません。例えば、次のクエリはエラーを返します。

    Copy
    (select listid from listing limit 10) intersect select listid from sales; ERROR: LIMIT may not be used within input to set operations.
  • セット演算子クエリが 10 進数の結果を返した場合、同じ精度とスケールで対応する結果列を返すように奨励されます。例えば、T1.REVENUE が DECIMAL(10,2) 列で T2.REVENUE が DECIMAL(8,4) 列の次のクエリでは、DECIMAL(12,4) への結果も 10 進数であることが奨励されます。

    Copy
    select t1.revenue union select t2.revenue;

    スケールは 4 になります。2 つの列の最大のスケールです。精度は 12 です。T1.REVENUE は小数点の左側に 8 桁必要であるからです (12 - 4 = 8)。このような奨励により、UNION の両側からのすべての値が結果に適合します。64 ビットの値の場合、最大結果精度は 19 で、最大結果スケールは 18 です。128 ビットの値の場合、最大結果精度は 38 で、最大結果スケールは 37 です。

    生成されるデータ型が Amazon Redshift の精度とスケールの上限を超えた場合、クエリはエラーを返します。

  • セット演算の実行時、列の対応する各ペアに対して、2 つのデータの値が同じか、両方とも NULL の場合、2 つの行は同じとして処理されます。例えば、テーブル T1 と T2 の両方に 1 つの列と 1 つの行が含まれていて、両方のテーブルでその行が NULL の場合、これらのテーブルに INTERSECT 演算に実行すると、その行が返されます。