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