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 |
|
|
Les lignes présentes dans les deux jeux de données |
|
|
Toutes les lignes des deux jeux de données combinés |
|
|
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. UtilisezINTERSECT,UNIONouEXCEPTsans le mot-cléALL.Sémantique de sac : conserve les lignes en double. Utilisez
INTERSECT ALL,UNION ALLouEXCEPT 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
STRINGet d'autres types est désactivée pour toutes les opérations ensemblistes. Convertissez explicitement les colonnes lorsque vous combinezSTRINGavec 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 |
|
|
Oui |
Clauses SELECT à combiner. Consultez la rubrique Syntaxe SELECT. |
|
|
Non |
Supprime les lignes en double de l'intersection. L'omission de |
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 |
|
|
Oui |
Clauses SELECT à combiner. Consultez la rubrique Syntaxe SELECT. |
|
|
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 BYetLIMITsuivantUNIONdépend du paramètreodps.sql.type.system.odps2:SET odps.sql.type.system.odps2=true;— la clause s'applique aux résultats de toutes les opérationsUNION.SET odps.sql.type.system.odps2=false;— la clause s'applique uniquement à la dernièreselect_statementde l'opérationUNION.
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 |
|
|
Oui |
Clauses SELECT à combiner. Consultez la rubrique Syntaxe SELECT. |
|
|
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 |
+------------+------------+