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

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

最終更新日:Dec 09, 2024

このトピックでは、MaxComputeのクエリ結果のデータセットに対して次の操作を実行する方法について説明します。INTERSECT,INTERSECT ALL,INTERSECT DISTINCT,UNION,UNION ALL,UNION DISTINCT,EXCEPT,EXCEPT ALL,EXCEPT DISTINCT,MINUS,MINUS ALL、およびMINUS DISTINCT.

説明

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

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

  • UNION: 2つのデータセットの和集合を返します。 和集合は、2つのデータセットを組み合わせることによって得られるデータセットである。

  • EXCEPT and MINUS: 2つのデータセットのいずれかから異なる値を返します。 これらの値は他のデータセットには含まれません。

制限事項

INTERSECT、UNION、EXCEPT、およびMINUSには次の制限があります。

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

  • 左右のテーブルの列数は同じでなければなりません。

使用上の注意

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

  • INTERSECT、UNION、EXCEPT、またはMINUS操作の結果は、特定の順序でソートすることはできません。

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

INTERSECT

  • 構文

    -- Obtain an intersection that contains duplicate values.
    <select_statement1> intersect all <select_statement2>;
    -- Obtain an intersection that does not contain duplicate values. The usage of INTERSECT is equivalent to that of INTERSECT DISTINCT.
    <select_statement1> intersect [distinct] <select_statement2>;
  • パラメーター

    • select_statement1およびselect_statement2: required これらのパラメーターは、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);
      -- The preceding statement is equivalent to the following statement:
      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

  • 構文

    -- Obtain a union that contains duplicate values.
    <select_statement1> union all <select_statement2>;
    -- Obtain a union that does not contain duplicate values.
    <select_statement1> union [distinct] <select_statement2>;
  • 使用上の注意

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

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

  • パラメーター

    • select_statement1およびselect_statement2: required これらのパラメーターは、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);
      -- The preceding statement is equivalent to the following statement:
      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句を使用し、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句を使用し、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

  • 構文

    -- Obtain the supplementary set of two datasets. The supplementary set contains duplicate values.
    <select_statement1> except all <select_statement2>;
    <select_statement1> minus all <select_statement2>;
    -- Obtain the supplementary set of two datasets. The supplementary set does not contain duplicate values.
    <select_statement1> except [distinct] <select_statement2>;
    <select_statement1> minus [distinct] <select_statement2>;
    説明

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

  • パラメーター

    • select_statement1およびselect_statement2: required これらのパラメーターは、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);
      -- The preceding statement is equivalent to the following statement:
      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);
      -- The preceding statement is equivalent to the following statements:
      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);
      -- The preceding statements are equivalent to the following statement:
      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          |
      +------------+------------+