Tous les produits
Search
Centre de documentation

MaxCompute:SEMI JOIN

Dernière mise à jour :Aug 20, 2026

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.