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.
Como funciona
O MaxCompute oferece suporte às seguintes operações SEMI JOIN:
LEFT SEMI JOIN
Retorna as linhas da tabela esquerda que possuem uma linha correspondente na tabela direita. Equivale a uma subconsulta IN.
LEFT ANTI JOIN
Retorna as linhas da tabela esquerda que não possuem uma linha correspondente na tabela direita. É semelhante, mas não idêntica, a uma subconsulta NOT IN.
Ambas as operações aceitam a dica MAPJOIN para melhorar o desempenho.
Limitações
Você pode referenciar a tabela direita apenas na condição de junção (cláusula ON), não 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 encontra todas as linhas na tabela sale_detail que possuem 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 |
+-----------+-------------+-------------+-----------+--------+Retorna apenas as linhas de sale_detail que possuem um total_price correspondente em sale_detail_sj.
Exemplo de LEFT ANTI JOIN
Este exemplo encontra todas as linhas na tabela sale_detail que não possuem 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 |
+-----------+-------------+-------------+-----------+--------+Retorna apenas as linhas de sale_detail que não possuem um total_price correspondente em sale_detail_sj.