Todos os produtos
Search
Central de documentação

MaxCompute:INTERSECT, UNION, EXCEPT e MINUS

Última atualização: Aug 21, 2026

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

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 à 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.

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 STRING e outros tipos permanece desativada em 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 SELECT syntax.

DISTINCT

Não

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

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

select_statement1, select_statement2

Sim

Cláusulas SELECT a combinar. Consulte SELECT syntax.

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 do UNION.

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

select_statement1, select_statement2

Sim

Cláusulas SELECT a combinar. Consulte SELECT syntax.

DISTINCT

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