Tous les produits
Search
Centre de documentation

MaxCompute:INTERSECT, UNION, EXCEPT et MINUS

Dernière mise à jour :Aug 21, 2026

MaxCompute prend en charge quatre opérateurs ensemblistes pour combiner les jeux de résultats de requêtes : INTERSECT, UNION, EXCEPT et MINUS. Chaque opérateur propose deux variantes qui diffèrent par la gestion des lignes en double.

Présentation

Opérateur

Renvoie

INTERSECT

Les lignes présentes dans les deux jeux de données

UNION

Toutes les lignes des deux jeux de données combinés

EXCEPT / MINUS

Les lignes du jeu de données de gauche absentes du jeu de données de droite

EXCEPT et MINUS sont synonymes : ils produisent des résultats identiques.

Gestion des doublons : sémantique d'ensemble vs sémantique de sac

Tous les opérateurs ensemblistes fonctionnent selon l'un des deux modes suivants :

  • Sémantique d'ensemble (par défaut) : supprime les lignes en double du résultat, ce qui équivaut à appliquer DISTINCT. Utilisez INTERSECT, UNION ou EXCEPT sans le mot-clé ALL.

  • Sémantique de sac : conserve les lignes en double. Utilisez INTERSECT ALL, UNION ALL ou EXCEPT ALL.

En résumé : avec ALL, les doublons sont conservés ; sans ALL, ils sont supprimés.

Limites

  • Les opérateurs ensemblistes peuvent combiner au maximum 256 jeux de données dans une seule instruction. Le dépassement de cette limite génère une erreur.

  • Les deux jeux de données doivent comporter le même nombre de colonnes.

Notes d'utilisation

  • L'ordre des résultats n'est pas garanti, sauf si vous ajoutez une clause ORDER BY.

  • Si les colonnes correspondantes ont des types de données incompatibles, MaxCompute effectue une conversion de type implicite avant d'exécuter l'opération. Consultez la rubrique Types de données pour connaître les règles de conversion.

  • La conversion de type implicite entre STRING et d'autres types est désactivée pour toutes les opérations ensemblistes. Convertissez explicitement les colonnes lorsque vous combinez STRING avec des types non textuels.

INTERSECT

Renvoie les lignes présentes dans les deux jeux de données.

Syntaxe

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

Paramètres

Paramètre

Obligatoire

Description

select_statement1, select_statement2

Oui

Clauses SELECT à combiner. Consultez la rubrique Syntaxe SELECT.

DISTINCT

Non

Supprime les lignes en double de l'intersection. L'omission de ALL produit le même effet.

Exemples

Exemple 1 : Renvoyer l'intersection en conservant les lignes en double.

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);

Résultat :

+------------+------------+
| a          | b          |
+------------+------------+
| 1          | 2          |
| 1          | 2          |
| 3          | 4          |
+------------+------------+

Exemple 2 : Renvoyer l'intersection en supprimant les lignes en double.

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;

Résultat :

+------------+------------+
| a          | b          |
+------------+------------+
| 1          | 2          |
| 3          | 4          |
+------------+------------+

UNION

Renvoie toutes les lignes des deux jeux de données combinés.

Syntaxe

-- Keep duplicate rows in the result.
<select_statement1> UNION ALL <select_statement2>;

-- Remove duplicate rows from the result.
<select_statement1> UNION [DISTINCT] <select_statement2>;

Paramètres

Paramètre

Obligatoire

Description

select_statement1, select_statement2

Oui

Clauses SELECT à combiner. Consultez la rubrique Syntaxe SELECT.

DISTINCT

Non

Supprime les lignes en double du résultat de l'union.

Notes d'utilisation

  • Lorsque vous enchaînez plusieurs opérations UNION ALL, utilisez des parenthèses pour spécifier l'ordre d'évaluation.

  • Le comportement des clauses CLUSTER BY, DISTRIBUTE BY, SORT BY, ORDER BY et LIMIT suivant UNION dépend du paramètre odps.sql.type.system.odps2 :

    • SET odps.sql.type.system.odps2=true; — la clause s'applique aux résultats de toutes les opérations UNION.

    • SET odps.sql.type.system.odps2=false; — la clause s'applique uniquement à la dernière select_statement de l'opération UNION.

Exemples

Exemple 1 : Renvoyer l'union en conservant les lignes en double.

SELECT * FROM VALUES (1, 2), (1, 2), (3, 4) t(a, b)
UNION ALL
SELECT * FROM VALUES (1, 2), (1, 4) t(a, b);

Résultat :

+------------+------------+
| a          | b          |
+------------+------------+
| 1          | 2          |
| 1          | 2          |
| 3          | 4          |
| 1          | 2          |
| 1          | 4          |
+------------+------------+

Exemple 2 : Renvoyer l'union en supprimant les lignes en double.

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));

Résultat :

+------------+------------+
| a          | b          |
+------------+------------+
| 1          | 2          |
| 1          | 4          |
| 3          | 4          |
+------------+------------+

Exemple 3 : Utiliser des parenthèses pour contrôler l'ordre d'évaluation des opérations 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));

Résultat :

+------------+------------+
| a          | b          |
+------------+------------+
| 1          | 2          |
| 1          | 2          |
| 5          | 6          |
| 1          | 2          |
| 1          | 2          |
| 3          | 4          |
| 1          | 2          |
| 1          | 4          |
+------------+------------+

Exemple 4 : Utiliser UNION ALL suivi de ORDER BY et LIMIT avec odps.sql.type.system.odps2=true. Les clauses ORDER BY et LIMIT s'appliquent au jeu de résultats combiné.

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;

Résultat :

+------------+
| a          |
+------------+
| 0          |
| 1          |
| 2          |
+------------+

Exemple 5 : Utiliser UNION ALL suivi de ORDER BY et LIMIT avec odps.sql.type.system.odps2=false. Les clauses ORDER BY et LIMIT s'appliquent uniquement à la dernière instruction SELECT, et non au résultat combiné. Toutes les lignes des deux requêtes sont renvoyées.

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;

Résultat :

+------------+
| a          |
+------------+
| 3          |
| 1          |
| 0          |
| 2          |
| 4          |
+------------+

EXCEPT et MINUS

Renvoie les lignes du jeu de données de gauche absentes du jeu de données de droite. EXCEPT et MINUS sont synonymes.

Syntaxe

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

Paramètres

Paramètre

Obligatoire

Description

select_statement1, select_statement2

Oui

Clauses SELECT à combiner. Consultez la rubrique Syntaxe SELECT.

DISTINCT

Non

Supprime les lignes en double du résultat.

Exemples

Exemple 1 : Renvoyer les lignes du jeu de données de gauche absentes du jeu de données de droite, en conservant les lignes en double.

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);

Résultat :

+------------+------------+
| a          | b          |
+------------+------------+
| 1          | 2          |
| 1          | 2          |
| 3          | 4          |
| 7          | 8          |
+------------+------------+

Exemple 2 : Renvoyer les lignes du jeu de données de gauche absentes du jeu de données de droite, en supprimant les lignes en double.

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);

Résultat :

+------------+------------+
| a          | b          |
+------------+------------+
| 1          | 2          |
| 7          | 8          |
+------------+------------+