Todos os produtos
Search
Central de documentação

MaxCompute:SEMI JOIN

Última atualização: Aug 20, 2026

O MaxCompute oferece suporte a LEFT SEMI JOIN e LEFT ANTI JOIN para filtrar linhas da tabela à esquerda com base na existência de uma linha correspondente na tabela à direita. Este tópico descreve a sintaxe dessas operações e apresenta exemplos de uso.

Funcionamento

O MaxCompute oferece suporte às seguintes operações de SEMI JOIN:

  • LEFT SEMI JOIN

    Retorna as linhas da tabela à esquerda que possuem correspondência na tabela à direita. Essa operação equivale a uma IN subquery.

  • LEFT ANTI JOIN

    Retorna as linhas da tabela à esquerda sem correspondência na tabela à direita. Embora semelhante a uma NOT IN subquery, essa operação não é idêntica a ela.

Ambas as operações aceitam o MAPJOIN hint para melhorar o desempenho.

Limitações

Referencie a tabela à direita apenas na condição de junção (cláusula ON). Não utilize essa tabela nas cláusulas WHERE ou SELECT.

Dados de exemplo

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

Exemplos de uso

Exemplo de LEFT SEMI JOIN

Este exemplo localiza todas as linhas da tabela sale_detail com um total_price correspondente na tabela 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  |
+-----------+-------------+-------------+-----------+--------+

O resultado inclui apenas as linhas de sale_detail com um total_price correspondente em sale_detail_sj.

Exemplo de LEFT ANTI JOIN

Este exemplo identifica todas as linhas da tabela sale_detail sem um total_price correspondente na tabela 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  |
+-----------+-------------+-------------+-----------+--------+

A consulta retorna somente as linhas de sale_detail que não possuem um total_price correspondente em sale_detail_sj.