全部產品
Search
文件中心

MaxCompute:SEMI JOIN(半串連)

更新時間:Aug 21, 2026

MaxCompute 支援 LEFT SEMI JOIN 和 LEFT ANTI JOIN 兩種半串連文法,用於基於右表條件過濾左表資料。本文介紹其文法和使用樣本。

功能介紹

MaxCompute支援如下SEMI JOIN操作:

  • LEFT SEMI JOIN

    返回左表中在右表有匹配行的記錄。等價於 IN SUBQUERY

  • LEFT ANTI JOIN

    返回左表中在右表無匹配行的記錄。與NOT IN SUBQUERY 類似但不完全相同。

兩種操作均支援 MAPJOIN HINT 以提升效能。

使用限制

右表只能在串連條件(ON子句)中引用,不能在WHERE或SELECT子句中引用。

樣本資料

-- 建立一張分區表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
);

--向源表增加分區。
ALTER TABLE sale_detail ADD PARTITION (sale_date='2026', region='china');
ALTER TABLE sale_detail_sj ADD PARTITION (sale_date='2026', region='china');

--向源表追加資料。
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);

使用樣本

LEFT SEMI JOIN樣本

查詢sale_detail表中,total_price出現在sale_detail_sj表中的資料集。命令樣本如下:

SELECT * FROM sale_detail a
LEFT SEMI JOIN sale_detail_sj b
  ON a.total_price = b.total_price;
  
-- 返回結果如下:
+-----------+-------------+-------------+-----------+--------+
| shop_name | customer_id | total_price | sale_date | region |
+-----------+-------------+-------------+-----------+--------+
| s1        | c1          | 100.1       | 2026      | china  |
| s2        | c2          | 100.2       | 2026      | china  |
+-----------+-------------+-------------+-----------+--------+

返回 sale_detail 中能在 sale_detail_sj 找到相同 total_price 的行。

LEFT ANTI JOIN 樣本

查詢sale_detail表中,total_price沒有出現在sale_detail_sj表中的資料集。命令樣本如下:

SELECT * FROM sale_detail a
LEFT ANTI JOIN sale_detail_sj b
  ON a.total_price = b.total_price;
  
-- 返回結果如下:
+-----------+-------------+-------------+-----------+--------+
| shop_name | customer_id | total_price | sale_date | region |
+-----------+-------------+-------------+-----------+--------+
| s3        | c3          | 100.3       | 2026      | china  |
+-----------+-------------+-------------+-----------+--------+

返回 sale_detail 中無法在 sale_detail_sj 找到相同 total_price 的行。