Todos os produtos
Search
Central de documentação

MaxCompute:INTERSECT, UNION, EXCEPT e MINUS

Última atualização: Jun 26, 2026

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

INTERSECT

Linhas presentes em ambos os conjuntos de dados

UNION

Todas as linhas dos dois conjuntos de dados combinados

EXCEPT / MINUS

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. Use INTERSECT, UNION ou EXCEPT sem a palavra-chave ALL.

  • Semântica de multiconjunto: preserva linhas duplicadas. Use INTERSECT ALL, UNION ALL ou EXCEPT 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 STRING e outros tipos está desabilitada para todas as operações de conjunto. Converta explicitamente as colunas ao combinar STRING com 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

select_statement1, select_statement2

Sim

Cláusulas SELECT a combinar. Consulte Sintaxe do SELECT.

DISTINCT

Não

Remove linhas duplicadas da interseção. Omitir ALL produz o mesmo efeito.

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

select_statement1, select_statement2

Sim

Cláusulas SELECT a combinar. Consulte Sintaxe do SELECT.

DISTINCT

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 BY e LIMIT após UNION depende da configuração odps.sql.type.system.odps2:

    • SET odps.sql.type.system.odps2=true; — a cláusula aplica-se aos resultados de todas as operações UNION.

    • SET odps.sql.type.system.odps2=false; — a cláusula aplica-se apenas à última select_statement no UNION.

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

select_statement1, select_statement2

Sim

Cláusulas SELECT a combinar. Consulte Sintaxe do SELECT.

DISTINCT

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          |
+------------+------------+