このトピックでは、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 by
、DISTRIBUTE BY
、SORT BY
、ORDER 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 BY
、DISTRIBUTE BY
、SORT BY
、ORDER 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 BY
、DISTRIBUTE BY
、SORT BY
、ORDER 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 | +------------+------------+