すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:INTERSECT、UNION、EXCEPT、および MINUS

最終更新日:Jun 10, 2025

このトピックでは、MaxCompute でクエリ結果のデータセットに対して次の操作を実行する方法について説明します。INTERSECTINTERSECT ALLINTERSECT DISTINCTUNIONUNION ALLUNION DISTINCTEXCEPTEXCEPT ALLEXCEPT DISTINCTMINUSMINUS ALL、および MINUS DISTINCT

説明

MaxCompute は、データセットに対して次の操作をサポートしています。

  • INTERSECT: 2 つのデータセットの共通部分を返します。共通部分には、両方のデータセットに含まれる値が含まれます。

  • UNION: 2 つのデータセットの和集合を返します。和集合は、2 つのデータセットを結合して得られるデータセットです。

  • EXCEPT および MINUS: 2 つのデータセットのいずれかから、もう一方のデータセットには含まれていない個別の値を返します。

制限

INTERSECT、UNION、EXCEPT、および MINUS には、次の制限が課せられます。

  • MaxCompute では、最大 256 個のデータセットに対して同時に INTERSECT、UNION、EXCEPT、または MINUS 操作を実行できます。データセットの数が 256 を超えると、エラーが返されます。

  • 左テーブルと右テーブルの列数は同じである必要があります。

使用上の注意

2 つのデータセットに対して INTERSECT、UNION、EXCEPT、または MINUS 操作を実行する場合は、次の点に注意してください。

  • INTERSECT、UNION、EXCEPT、または MINUS 操作の結果は、特定の順序でソートされない場合があります。

  • データセットのデータ型に一貫性がない場合、MaxCompute は INTERSECT、UNION、EXCEPT、または MINUS 操作を実行する前に、データ型を暗黙的に変換します。暗黙的な変換の詳細については、「データ型」をご参照ください。互換性の問題を防ぐため、MaxCompute では、INTERSECT、UNION、EXCEPT、または MINUS 操作において、STRING 型のデータと他の型のデータ間の暗黙的な変換は無効になっています。

INTERSECT

  • 構文

    -- 重複する値を含む共通部分を取得します。
    <select_statement1> INTERSECT ALL <select_statement2>;
    -- 重複する値を含まない共通部分を取得します。INTERSECT の使用方法は、INTERSECT DISTINCT の使用方法と同じです。
    <select_statement1> INTERSECT [DISTINCT] <select_statement2>;
  • パラメーター

    • select_statement1 および select_statement2: 必須。これらのパラメーターは、SELECT 句を指定します。句の構文の詳細については、「SELECT 構文」をご参照ください。

    • distinct: オプション。このパラメーターは、2 つのデータセットの共通部分から重複する値を削除するために使用されます。

    • 例 1: 2 つのデータセットの共通部分を取得します。共通部分には、重複する値が含まれます。サンプルステートメント:

      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 6) t(a, b) 
      INTERSECT ALL
      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 7) t(a, b);

      次の結果が返されます。

      +------------+------------+
      | a          | b          |
      +------------+------------+
      | 1          | 2          |
      | 1          | 2          |
      | 3          | 4          |
      +------------+------------+
    • 例 2: 2 つのデータセットの共通部分を取得します。共通部分には、重複する値は含まれません。サンプルステートメント:

      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 6) t(a, b) 
      intersect distinct 
      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 7) t(a, b);
      -- 前述のステートメントは、次のステートメントと同じです。
      SELECT DISTINCT * FROM 
      (SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 6) t(a, b) 
      INTERSECT ALL 
      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (5, 7) t(a, b)) t;

      次の結果が返されます。

      +------------+------------+
      | a          | b          |
      +------------+------------+
      | 1          | 2          |
      | 3          | 4          |
      +------------+------------+

UNION

  • 構文

    -- 重複する値を含む和集合を取得します。
    <select_statement1> UNION ALL <select_statement2>;
    -- 重複する値を含まない和集合を取得します。
    <select_statement1> UNION [DISTINCT] <select_statement2>;
  • 使用上の注意

    • 複数の UNION ALL 操作が存在する場合は、括弧 () を使用して UNION ALL 操作の優先順位を指定します。

    • UNION の後に CLUSTER BYDISTRIBUTE BYSORT BYORDER BY、または LIMIT 句が続き、SET odps.sql.type.system.odps2=false; が設定されている場合、句は UNION の最後の select_statement に対してのみ機能します。SET odps.sql.type.system.odps2=false; が設定されている場合、句はすべての UNION 操作の結果に対して機能します。

  • パラメーター

    • select_statement1 および select_statement2: 必須。これらのパラメーターは、SELECT 句を指定します。句の構文の詳細については、「SELECT 構文」をご参照ください。

    • distinct: オプション。このパラメーターは、2 つのデータセットの和集合から重複する値を削除するために使用されます。

    • 例 1: 2 つのデータセットの和集合を取得します。和集合には、重複する値が含まれます。サンプルステートメント:

      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b) 
      UNION ALL 
      SELECT * FROM VALUES (1, 2), (1, 4) t(a, b);

      次の結果が返されます。

      +------------+------------+
      | a          | b          |
      +------------+------------+
      | 1          | 2          |
      | 1          | 2          |
      | 3          | 4          |
      | 1          | 2          |
      | 1          | 4          |
      +------------+------------+
    • 例 2: 2 つのデータセットの和集合を取得します。和集合には、重複する値は含まれません。サンプルステートメント:

      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
      UNION DISTINCT 
      SELECT * FROM VALUES (1, 2), (1, 4) t(a, b);
      -- 前述のステートメントは、次のステートメントと同じです。
      SELECT DISTINCT * FROM (
      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b) 
      UNION ALL 
      SELECT * FROM VALUES (1, 2), (1, 4) t(a, b));

      次の結果が返されます。

      +------------+------------+
      | a          | b          |
      +------------+------------+
      | 1          | 2          |
      | 1          | 4          |
      | 3          | 4          |
      +------------+------------+
    • 例 3: 括弧 () を使用して UNION ALL 操作の優先順位を指定します。サンプルステートメント:

      SELECT * FROM VALUES (1, 2), (1, 2), (5, 6) t(a, b)
      UNION ALL 
      (SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
      UNION ALL 
      SELECT * FROM VALUES (1, 2), (1, 4) t(a, b));

      次の結果が返されます。

      +------------+------------+
      | a          | b          |
      +------------+------------+
      | 1          | 2          |
      | 1          | 2          |
      | 5          | 6          |
      | 1          | 2          |
      | 1          | 2          |
      | 3          | 4          |
      | 1          | 2          |
      | 1          | 4          |
      +------------+------------+
    • 例 4: SELECT 文で UNION の後に CLUSTER BYDISTRIBUTE BYSORT BYORDER BY、または LIMIT 句を使用し、SET odps.sql.type.system.odps2=true; を設定します。サンプルステートメント:

      SET odps.sql.type.system.odps2=true;
      SELECT explode(ARRAY(3, 1)) AS (a) UNION ALL SELECT explode(ARRAY(0, 4, 2)) AS (a) ORDER BY a limit 3;

      次の結果が返されます。

      +------------+
      | a          |
      +------------+
      | 0          |
      | 1          |
      | 2          |
      +------------+
    • 例 5: SELECT 文で UNION の後に CLUSTER BYDISTRIBUTE BYSORT BYORDER BY、または LIMIT 句を使用し、SET odps.sql.type.system.odps2=false; を設定します。サンプルステートメント:

      SET odps.sql.type.system.odps2=false;
      SELECT explode(ARRAY(3, 1)) AS (a) UNION ALL SELECT explode(ARRAY(0, 4, 2)) AS (a) ORDER BY a limit 3;

      次の結果が返されます。

      +------------+
      | a          |
      +------------+
      | 3          |
      | 1          |
      | 0          |
      | 2          |
      | 4          |
      +------------+

EXCEPT および MINUS

  • 構文

    -- 2 つのデータセットの補集合を取得します。補集合には、重複する値が含まれます。
    <select_statement1> EXCEPT ALL <select_statement2>;
    <select_statement1> minus ALL <select_statement2>;
    -- 2 つのデータセットの補集合を取得します。補集合には、重複する値は含まれません。
    <select_statement1> EXCEPT [DISTINCT] <select_statement2>;
    <select_statement1> minus [DISTINCT] <select_statement2>;
    説明

    EXCEPT の使用方法は、MINUS の使用方法と同じです。

  • パラメーター

    • select_statement1 および select_statement2: 必須。これらのパラメーターは、SELECT 句を指定します。句の構文の詳細については、「SELECT 構文」をご参照ください。

    • distinct: オプション。このパラメーターは、2 つのデータセットの補集合から重複する値を削除するために使用されます。

    • 例 1: 2 つのデータセットの補集合を取得します。補集合には、重複する値が含まれます。サンプルステートメント:

      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (3, 4), (5, 6), (7, 8) t(a, b)
      EXCEPT ALL 
      SELECT * FROM VALUES (3, 4), (5, 6), (5, 6), (9, 10) t(a, b);
      -- 前述のステートメントは、次のステートメントと同じです。
      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (3, 4), (5, 6), (7, 8) t(a, b)
      MINUS ALL 
      SELECT * FROM VALUES (3, 4), (5, 6), (5, 6), (9, 10) t(a, b);

      次の結果が返されます。

      +------------+------------+
      | a          | b          |
      +------------+------------+
      | 1          | 2          |
      | 1          | 2          |
      | 3          | 4          |
      | 7          | 8          |
      +------------+------------+
    • 例 2: 2 つのデータセットの補集合を取得します。補集合には、重複する値は含まれません。サンプルステートメント:

      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (3, 4), (5, 6), (7, 8) t(a, b)
      EXCEPT DISTINCT 
      SELECT * FROM VALUES (3, 4), (5, 6), (5, 6), (9, 10) t(a, b);
      -- 前述のステートメントは、次のステートメントと同じです。
      SELECT * FROM VALUES (1, 2), (1, 2), (3, 4), (3, 4), (5, 6), (7, 8) t(a, b)
      MINUS DISTINCT 
      SELECT * FROM VALUES (3, 4), (5, 6), (5, 6), (9, 10) t(a, b);
      -- 前述のステートメントは、次のステートメントと同じです。
      SELECT DISTINCT * FROM VALUES (1, 2), (1, 2), (3, 4), (3, 4), (5, 6), (7, 8) t(a, b) except all select * from values (3, 4), (5, 6), (5, 6), (9, 10) t(a, b);

      次の結果が返されます。

      +------------+------------+
      | a          | b          |
      +------------+------------+
      | 1          | 2          |
      | 7          | 8          |
      +------------+------------+