全部产品
Search
文档中心

MaxCompute:SEMI JOIN

更新时间:Jun 19, 2025

MaxCompute mendukung dua jenis operasi SEMI JOIN: LEFT SEMI JOIN dan LEFT ANTI JOIN. Dalam operasi ini, data di tabel kanan tidak muncul dalam set hasil dan hanya digunakan untuk menyaring data di tabel kiri, yang dapat meningkatkan kinerja query. Topik ini menjelaskan cara menggunakan kedua operasi tersebut.

Deskripsi

MaxCompute mendukung jenis-jenis berikut dari operasi SEMI JOIN:

  • LEFT SEMI JOIN

    Operasi LEFT SEMI JOIN mengembalikan baris dari tabel kiri yang memiliki baris cocok di tabel kanan. Jika satu baris data di tabel kiri memenuhi kondisi tertentu dan muncul di tabel kanan, data tersebut termasuk dalam set hasil.

    Dalam MaxCompute, penggunaan LEFT SEMI JOIN mirip dengan IN SUBQUERY. Untuk informasi lebih lanjut tentang IN SUBQUERY, lihat IN SUBQUERY. Anda dapat memilih salah satu dari dua operasi tersebut.

  • LEFT ANTI JOIN

    Operasi LEFT ANTI JOIN mengembalikan baris dari tabel kiri yang tidak memiliki baris cocok di tabel kanan. Jika satu baris data di tabel kiri memenuhi kondisi tertentu tetapi tidak muncul di tabel kanan, data tersebut termasuk dalam set hasil.

    Dalam MaxCompute, penggunaan LEFT ANTI JOIN mirip dengan NOT IN SUBQUERY. Untuk informasi lebih lanjut tentang NOT IN SUBQUERY, lihat NOT IN SUBQUERY.

SEMI JOIN mendukung MAPJOIN hints. Petunjuk ini meningkatkan kinerja LEFT SEMI JOIN dan LEFT ANTI JOIN. Untuk informasi lebih lanjut tentang MAPJOIN hints, lihat MAPJOIN HINT.

Data sampel

Data sumber sampel disediakan untuk membantu Anda memahami contoh-contoh dalam topik ini. Pernyataan berikut menjelaskan cara membuat tabel sale_detail dan sale_detail_sj serta menyisipkan data ke dalam tabel-tabel tersebut.

-- 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 sale_detail. 
alter table sale_detail add partition (sale_date='2013', region='china');
alter table sale_detail_sj add partition (sale_date='2013', region='china');

-- Sisipkan data ke dalam tabel sale_detail. 
insert into sale_detail partition (sale_date='2013', region='china') values ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3);
insert into sale_detail_sj partition (sale_date='2013', region='china') values ('s1','c1',100.1),('s2','c2',100.2),('s5','c2',100.2),('s2','c2',100.2);

Contoh pernyataan untuk menampilkan data dalam tabel sale_detail dan sale_detail_sj:

set odps.sql.allow.fullscan=true;
select * from sale_detail;
-- Hasil berikut dikembalikan: 
+------------+-------------+-------------+------------+------------+
| shop_name  | customer_id | total_price | sale_date  | region     |
+------------+-------------+-------------+------------+------------+
| s1         | c1          | 100.1       | 2013       | china      |
| s2         | c2          | 100.2       | 2013       | china      |
| s3         | c3          | 100.3       | 2013       | china      |
+------------+-------------+-------------+------------+------------+
select * from sale_detail_sj;
-- Hasil berikut dikembalikan: 
+------------+-------------+-------------+------------+------------+
| shop_name  | customer_id | total_price | sale_date  | region     |
+------------+-------------+-------------+------------+------------+
| s1         | c1          | 100.1       | 2013       | china      |
| s2         | c2          | 100.2       | 2013       | china      |
| s5         | c2          | 100.2       | 2013       | china      |
| s2         | c2          | 100.2       | 2013       | china      |
+------------+-------------+-------------+------------+------------+
                

Contoh

  • Contoh 1: Kueri data kolom total_price dari tabel sale_detail dan dapatkan data yang muncul di kolom total_price tabel sale_detail_sj. Contoh pernyataan:

    select * from sale_detail a left semi join sale_detail_sj b on a.total_price=b.total_price;

    Hasil berikut dikembalikan:

    +------------+-------------+-------------+------------+------------+
    | shop_name  | customer_id | total_price | sale_date  | region     |
    +------------+-------------+-------------+------------+------------+
    | s2         | c2          | 100.2       | 2013       | china      |
    | s1         | c1          | 100.1       | 2013       | china      |
    +------------+-------------+-------------+------------+------------+

    Sebagian data kolom total_price di tabel sale_detail muncul di kolom total_price tabel sale_detail_sj dan data tersebut dikembalikan.

  • Contoh 2: Kueri data kolom total_price dari tabel sale_detail dan dapatkan data yang tidak muncul di kolom total_price tabel sale_detail_sj. Contoh pernyataan:

    select * from sale_detail a left anti join sale_detail_sj b on a.total_price=b.total_price;

    Hasil berikut dikembalikan:

    +------------+-------------+-------------+------------+------------+
    | shop_name  | customer_id | total_price | sale_date  | region     |
    +------------+-------------+-------------+------------+------------+
    | s3         | c3          | 100.3       | 2013       | china      |
    +------------+-------------+-------------+------------+------------+

    Sebagian data kolom total_price di tabel sale_detail tidak muncul di kolom total_price tabel sale_detail_sj dan data tersebut dikembalikan.