All Products
Search
Document Center

MaxCompute:SEMI JOIN

Last Updated:Aug 21, 2026

MaxCompute mendukung LEFT SEMI JOIN dan LEFT ANTI JOIN untuk memfilter baris dari tabel kiri berdasarkan keberadaan baris yang cocok di tabel kanan. Topik ini menjelaskan sintaks serta memberikan contoh penggunaannya.

Cara kerja

MaxCompute mendukung operasi SEMI JOIN berikut:

  • LEFT SEMI JOIN

    Mengembalikan baris dari tabel kiri yang memiliki baris yang cocok di tabel kanan. Operasi ini setara dengan subkueri IN.

  • LEFT ANTI JOIN

    Mengembalikan baris dari tabel kiri yang tidak memiliki baris yang cocok di tabel kanan. Operasi ini mirip dengan, tetapi tidak identik dengan, subkueri NOT IN.

Kedua operasi mendukung Petunjuk MAPJOIN untuk meningkatkan performa.

Batasan

Anda hanya dapat mereferensikan tabel kanan dalam kondisi join (klausa ON), bukan dalam klausa WHERE atau SELECT.

Data contoh

-- Buat tabel partisi bernama 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
);

-- Tambahkan partisi ke tabel sumber.
ALTER TABLE sale_detail ADD PARTITION (sale_date='2026', region='china');
ALTER TABLE sale_detail_sj ADD PARTITION (sale_date='2026', region='china');

-- Masukkan data ke tabel sumber.
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);

Contoh penggunaan

Contoh LEFT SEMI JOIN

Contoh ini menemukan semua baris di tabel sale_detail yang memiliki nilai total_price yang cocok di tabel sale_detail_sj.

SELECT * FROM sale_detail a
LEFT SEMI JOIN sale_detail_sj b
  ON a.total_price = b.total_price;
  
-- Hasil yang dikembalikan:
+-----------+-------------+-------------+-----------+--------+
| shop_name | customer_id | total_price | sale_date | region |
+-----------+-------------+-------------+-----------+--------+
| s1        | c1          | 100.1       | 2026      | china  |
| s2        | c2          | 100.2       | 2026      | china  |
+-----------+-------------+-------------+-----------+--------+

Mengembalikan hanya baris dari sale_detail yang memiliki nilai total_price yang cocok di sale_detail_sj.

Contoh LEFT ANTI JOIN

Contoh ini menemukan semua baris di tabel sale_detail yang tidak memiliki nilai total_price yang cocok di tabel sale_detail_sj.

SELECT * FROM sale_detail a
LEFT ANTI JOIN sale_detail_sj b
  ON a.total_price = b.total_price;
  
-- Hasil yang dikembalikan:
+-----------+-------------+-------------+-----------+--------+
| shop_name | customer_id | total_price | sale_date | region |
+-----------+-------------+-------------+-----------+--------+
| s3        | c3          | 100.3       | 2026      | china  |
+-----------+-------------+-------------+-----------+--------+

Mengembalikan hanya baris dari sale_detail yang tidak memiliki nilai total_price yang cocok di sale_detail_sj.