UNION、INTERSECT、または EXCEPT - Amazon Redshift

UNION、INTERSECT、または EXCEPT

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

構文

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

パラメータ

query

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

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

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 セット演算子は左結合です。優先順位の決定でかっこを指定しなかった場合、これらのセット演算子の組み合わせは、左から右に評価されます。例えば、次のクエリでは、T1 と T2 の UNION が最初に評価され、次に UNION の結果に対して、EXCEPT 演算が実行されます。

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

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

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

かっこを追加することで、評価の順番を変更することができます。次のケースでは、T1 と T2 の結合結果と T3 の積集合を求めます。このクエリでは異なる結果が生成されます。

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

使用に関する注意事項

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

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

  • セット演算子クエリが 10 進数の結果を返した場合、同じ精度とスケールで対応する結果列を返すように奨励されます。例えば、T1.REVENUE が DECIMAL(10,2) 列で T2.REVENUE が DECIMAL(8,4) 列の次のクエリでは、DECIMAL(12,4) への結果も 10 進数であることが奨励されます。

    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 行が同一として扱われるのは、対応する列のペアごとに、2 つのデータ値が等しいまたはどちらも NULL である場合です。例えば、テーブル T1 と T2 の両方に 1 つの列と 1 つの行が含まれていて、両方のテーブルでその行が NULL の場合、これらのテーブルに INTERSECT 演算に実行すると、その行が返されます。