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.