O MaxCompute oferece quatro operadores de conjunto para combinar resultados de consultas: INTERSECT, UNION, EXCEPT e MINUS. Cada operador tem duas variantes que diferem no tratamento de 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 de dados à 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.
Em resumo: com ALL, as duplicatas são mantidas; sem ALL, são removidas.
Limites
É possível combinar no máximo 256 conjuntos de dados em uma única instrução com operadores de conjunto. Exceder esse limite gera erro.
Ambos os conjuntos de dados devem ter o mesmo número de colunas.
Observações de uso
A ordem dos resultados não é garantida, a menos que se adicione uma cláusula
ORDER BY.Se as colunas correspondentes tiverem tipos de dados incompatíveis, o MaxCompute executará conversão implícita de tipo antes da operação. Consulte as regras de conversão em Tipos de dados.
A conversão implícita entre
STRINGe outros tipos está desabilitada para 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 Sintaxe do SELECT. |
|
|
Não |
Remove linhas duplicadas da interseção. Omitir |
Exemplos
Exemplo 1: Retornar a interseção mantendo 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 removendo 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 Sintaxe do SELECT. |
|
|
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_statementnoUNION.
Exemplos
Exemplo 1: Retornar a união mantendo 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 removendo 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. As cláusulas ORDER BY e LIMIT aplicam-se apenas à última instrução SELECT, e não ao resultado combinado. Todas as linhas de ambas as consultas são retornadas.
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 de dados à 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 Sintaxe do SELECT. |
|
|
Não |
Remove linhas duplicadas do resultado. |
Exemplos
Exemplo 1: Retornar linhas do conjunto de dados à esquerda ausentes no conjunto de dados à direita, mantendo linhas duplicadas.
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 de dados à esquerda ausentes no conjunto de dados à direita, removendo linhas duplicadas.
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 |
+------------+------------+