O MaxCompute oferece quatro operadores de conjunto para combinar resultados de consultas: INTERSECT, UNION, EXCEPT e MINUS. Cada operador tem duas variantes com comportamentos distintos para linhas duplicadas.
Visão geral
|
Operador |
Retorno |
|
|
Linhas presentes em ambos os conjuntos de dados |
|
|
Todas as linhas dos dois conjuntos de dados combinados |
|
|
Linhas do conjunto de dados à esquerda ausentes no conjunto à direita |
Os operadores EXCEPT e MINUS são sinônimos e produzem resultados idênticos.
Tratamento de duplicatas: semântica de conjunto vs. semântica de multiconjunto
Os operadores de conjunto funcionam em um destes dois modos:
Semântica de conjunto (padrão): remove linhas duplicadas do resultado, equivalente a aplicar
DISTINCT. UseINTERSECT,UNIONouEXCEPTsem a palavra-chaveALL.Semântica de multiconjunto: preserva linhas duplicadas. Use
INTERSECT ALL,UNION ALLouEXCEPT ALL.
Resumindo: com ALL, as duplicatas são mantidas; sem ALL, são removidas.
Limites
Os operadores de conjunto combinam no máximo 256 conjuntos de dados em uma única instrução. Exceder esse limite gera um erro.
Ambos os conjuntos de dados devem ter o mesmo número de colunas.
Observações de uso
A ordenação dos resultados não é garantida sem uma cláusula
ORDER BY.Se as colunas correspondentes tiverem tipos de dados incompatíveis, o MaxCompute realizará conversão implícita antes de executar a operação. Consulte as regras em Data types.
A conversão implícita entre
STRINGe outros tipos permanece desativada em todas as operações de conjunto. Converta explicitamente as colunas ao combinarSTRINGcom tipos não string.
INTERSECT
Retorna linhas presentes em ambos os conjuntos de dados.
Sintaxe
-- Keep duplicate rows in the result.
<select_statement1> INTERSECT ALL <select_statement2>;
-- Remove duplicate rows from the result. INTERSECT and INTERSECT DISTINCT are equivalent.
<select_statement1> INTERSECT [DISTINCT] <select_statement2>;
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
|
Sim |
Cláusulas SELECT a combinar. Consulte SELECT syntax. |
|
|
Não |
Remove linhas duplicadas da interseção. Omitir |
Exemplos
Exemplo 1: Retornar a interseção e manter linhas duplicadas.
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);
Resultado:
+------------+------------+
| a | b |
+------------+------------+
| 1 | 2 |
| 1 | 2 |
| 3 | 4 |
+------------+------------+
Exemplo 2: Retornar a interseção e remover linhas duplicadas.
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);
-- Equivalent to:
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;
Resultado:
+------------+------------+
| a | b |
+------------+------------+
| 1 | 2 |
| 3 | 4 |
+------------+------------+
UNION
Retorna todas as linhas dos dois conjuntos de dados combinados.
Sintaxe
-- Keep duplicate rows in the result.
<select_statement1> UNION ALL <select_statement2>;
-- Remove duplicate rows from the result.
<select_statement1> UNION [DISTINCT] <select_statement2>;
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
|
Sim |
Cláusulas SELECT a combinar. Consulte SELECT syntax. |
|
|
Não |
Remove linhas duplicadas do resultado da união. |
Observações de uso
Ao encadear várias operações
UNION ALL, use parênteses para definir a ordem de avaliação.-
O comportamento das cláusulas
CLUSTER BY,DISTRIBUTE BY,SORT BY,ORDER BYeLIMITapósUNIONdepende da configuraçãoodps.sql.type.system.odps2:SET odps.sql.type.system.odps2=true;— a cláusula aplica-se aos resultados de todas as operaçõesUNION.SET odps.sql.type.system.odps2=false;— a cláusula aplica-se apenas à últimaselect_statementdoUNION.
Exemplos
Exemplo 1: Retornar a união e manter linhas duplicadas.
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
UNION ALL
SELECT * FROM VALUES (1, 2), (1, 4) t(a, b);
Resultado:
+------------+------------+
| a | b |
+------------+------------+
| 1 | 2 |
| 1 | 2 |
| 3 | 4 |
| 1 | 2 |
| 1 | 4 |
+------------+------------+
Exemplo 2: Retornar a união e remover linhas duplicadas.
SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
UNION DISTINCT
SELECT * FROM VALUES (1, 2), (1, 4) t(a, b);
-- Equivalent to:
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));
Resultado:
+------------+------------+
| a | b |
+------------+------------+
| 1 | 2 |
| 1 | 4 |
| 3 | 4 |
+------------+------------+
Exemplo 3: Usar parênteses para controlar a ordem de avaliação das operações 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));
Resultado:
+------------+------------+
| a | b |
+------------+------------+
| 1 | 2 |
| 1 | 2 |
| 5 | 6 |
| 1 | 2 |
| 1 | 2 |
| 3 | 4 |
| 1 | 2 |
| 1 | 4 |
+------------+------------+
Exemplo 4: Usar UNION ALL seguido de ORDER BY e LIMIT com odps.sql.type.system.odps2=true. As cláusulas ORDER BY e LIMIT aplicam-se ao conjunto de resultados combinado.
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;
Resultado:
+------------+
| a |
+------------+
| 0 |
| 1 |
| 2 |
+------------+
Exemplo 5: Usar UNION ALL seguido de ORDER BY e LIMIT com odps.sql.type.system.odps2=false. Nesse caso, ORDER BY e LIMIT afetam somente a última instrução SELECT, e não o resultado combinado. O sistema retorna todas as linhas de ambas as consultas.
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;
Resultado:
+------------+
| a |
+------------+
| 3 |
| 1 |
| 0 |
| 2 |
| 4 |
+------------+
EXCEPT e MINUS
Retorna linhas do conjunto de dados à esquerda ausentes no conjunto à direita. EXCEPT e MINUS são sinônimos.
Sintaxe
-- Keep duplicate rows in the result.
<select_statement1> EXCEPT ALL <select_statement2>;
<select_statement1> MINUS ALL <select_statement2>;
-- Remove duplicate rows from the result.
<select_statement1> EXCEPT [DISTINCT] <select_statement2>;
<select_statement1> MINUS [DISTINCT] <select_statement2>;
Parâmetros
|
Parâmetro |
Obrigatório |
Descrição |
|
|
Sim |
Cláusulas SELECT a combinar. Consulte SELECT syntax. |
|
|
Não |
Remove linhas duplicadas do resultado. |
Exemplos
Exemplo 1: Retornar linhas do conjunto à esquerda ausentes no conjunto à direita e manter duplicatas.
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);
-- Equivalent to:
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);
Resultado:
+------------+------------+
| a | b |
+------------+------------+
| 1 | 2 |
| 1 | 2 |
| 3 | 4 |
| 7 | 8 |
+------------+------------+
Exemplo 2: Retornar linhas do conjunto à esquerda ausentes no conjunto à direita e remover duplicatas.
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);
-- Equivalent to:
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);
-- Both are equivalent to:
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);
Resultado:
+------------+------------+
| a | b |
+------------+------------+
| 1 | 2 |
| 7 | 8 |
+------------+------------+