MaxCompute prend en charge les opérations LEFT SEMI JOIN et LEFT ANTI JOIN pour filtrer les lignes d'une table de gauche selon l'existence ou non d'une ligne correspondante dans la table de droite. Cette rubrique décrit leur syntaxe et fournit des exemples d'utilisation.
Fonctionnement
MaxCompute prend en charge les opérations SEMI JOIN suivantes :
-
LEFT SEMI JOIN
Renvoie les lignes de la table de gauche qui possèdent une ligne correspondante dans la table de droite. Cela équivaut à une sous-requête IN.
-
LEFT ANTI JOIN
Renvoie les lignes de la table de gauche qui ne possèdent aucune ligne correspondante dans la table de droite. Le comportement est similaire, mais non identique, à celui d'une sous-requête NOT IN.
Ces deux opérations prennent en charge l'indicateur MAPJOIN afin d'améliorer les performances.
Limites
Faites référence à la table de droite uniquement dans la condition de jointure (clause ON), et non dans les clauses WHERE ou SELECT.
Exemple de données
-- Create a partitioned table named sale_detail.
CREATE TABLE IF NOT EXISTS sale_detail (
shop_name STRING,
customer_id STRING,
total_price DOUBLE
)
PARTITIONED BY (
sale_date STRING,
region STRING
);
CREATE TABLE IF NOT EXISTS sale_detail_sj (
shop_name STRING,
customer_id STRING,
total_price DOUBLE
)
PARTITIONED BY (
sale_date STRING,
region STRING
);
-- Add partitions to the source tables.
ALTER TABLE sale_detail ADD PARTITION (sale_date='2026', region='china');
ALTER TABLE sale_detail_sj ADD PARTITION (sale_date='2026', region='china');
-- Insert data into the source tables.
INSERT INTO sale_detail PARTITION (sale_date='2026', region='china') VALUES ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3);
INSERT INTO sale_detail_sj PARTITION (sale_date='2026', region='china') VALUES ('s1','c1',100.1),('s2','c2',100.2),('s5','c2',100.2),('s2','c2',100.2);
Exemples d'utilisation
Exemple de LEFT SEMI JOIN
Cet exemple identifie toutes les lignes de la table sale_detail présentant une valeur total_price correspondante dans la table sale_detail_sj.
SELECT * FROM sale_detail a
LEFT SEMI JOIN sale_detail_sj b
ON a.total_price = b.total_price;
-- Returned result:
+-----------+-------------+-------------+-----------+--------+
| shop_name | customer_id | total_price | sale_date | region |
+-----------+-------------+-------------+-----------+--------+
| s1 | c1 | 100.1 | 2026 | china |
| s2 | c2 | 100.2 | 2026 | china |
+-----------+-------------+-------------+-----------+--------+
Le résultat contient uniquement les lignes de sale_detail dont la valeur total_price trouve une correspondance dans sale_detail_sj.
Exemple de LEFT ANTI JOIN
Cet exemple identifie toutes les lignes de la table sale_detail qui ne présentent aucune valeur total_price correspondante dans la table sale_detail_sj.
SELECT * FROM sale_detail a
LEFT ANTI JOIN sale_detail_sj b
ON a.total_price = b.total_price;
-- Returned result:
+-----------+-------------+-------------+-----------+--------+
| shop_name | customer_id | total_price | sale_date | region |
+-----------+-------------+-------------+-----------+--------+
| s3 | c3 | 100.3 | 2026 | china |
+-----------+-------------+-------------+-----------+--------+
Le résultat contient uniquement les lignes de sale_detail qui ne trouvent pas de correspondance pour la colonne total_price dans sale_detail_sj.