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 JOINOperasi
LEFT SEMI JOINmengembalikan 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 JOINmirip denganIN SUBQUERY. Untuk informasi lebih lanjut tentang IN SUBQUERY, lihat IN SUBQUERY. Anda dapat memilih salah satu dari dua operasi tersebut.LEFT ANTI JOINOperasi
LEFT ANTI JOINmengembalikan 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 JOINmirip denganNOT 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.