MaxCompute, sağ tablodaki eşleşen satırların varlığına göre sol tablodaki satırları filtrelemek için LEFT SEMI JOIN ve LEFT ANTI JOIN işlemlerini destekler. Bu konu, söz konusu işlemlerin sözdizimini açıklar ve kullanım örnekleri sunar.
Çalışma Mantığı
MaxCompute aşağıdaki SEMI JOIN işlemlerini destekler:
-
LEFT SEMI JOIN
Sağ tabloda eşleşen bir satırı olan sol tablo satırlarını döndürür. Bu işlem, bir IN alt sorgusuna eşdeğerdir.
-
LEFT ANTI JOIN
Sağ tabloda eşleşen bir satırı olmayan sol tablo satırlarını döndürür. Bu işlem, bir NOT IN alt sorgusuna benzer ancak tamamen aynı değildir.
Her iki işlem de performansı artırmak için MAPJOIN ipucunu destekler.
Sınırlamalar
Sağ tabloya yalnızca birleştirme koşulunda (ON yan tümcesi) başvurabilirsiniz; WHERE veya SELECT yan tümcelerinde kullanamazsınız.
Örnek veriler
-- Create a partitioned table named 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
);
-- Add partitions to the source tables.
ALTER TABLE sale_detail ADD PARTITION (sale_date='2026', region='china');
ALTER TABLE sale_detail_sj ADD PARTITION (sale_date='2026', region='china');
-- Insert data into the source tables.
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);
Kullanım örnekleri
LEFT SEMI JOIN örneği
Bu örnekte, sale_detail_sj tablosunda eşleşen bir total_price değeri bulunan sale_detail tablosundaki tüm satırlar bulunur.
SELECT * FROM sale_detail a
LEFT SEMI JOIN sale_detail_sj b
ON a.total_price = b.total_price;
-- Returned result:
+-----------+-------------+-------------+-----------+--------+
| shop_name | customer_id | total_price | sale_date | region |
+-----------+-------------+-------------+-----------+--------+
| s1 | c1 | 100.1 | 2026 | china |
| s2 | c2 | 100.2 | 2026 | china |
+-----------+-------------+-------------+-----------+--------+
sale_detail_sj içinde eşleşen bir total_price değerine sahip olan sale_detail satırlarını yalnızca döndürür.
LEFT ANTI JOIN örneği
Bu örnekte, sale_detail_sj tablosunda eşleşen bir total_price değeri bulunmayan sale_detail tablosundaki tüm satırlar bulunur.
SELECT * FROM sale_detail a
LEFT ANTI JOIN sale_detail_sj b
ON a.total_price = b.total_price;
-- Returned result:
+-----------+-------------+-------------+-----------+--------+
| shop_name | customer_id | total_price | sale_date | region |
+-----------+-------------+-------------+-----------+--------+
| s3 | c3 | 100.3 | 2026 | china |
+-----------+-------------+-------------+-----------+--------+
sale_detail_sj içinde eşleşen bir total_price değeri olmayan sale_detail satırlarını yalnızca döndürür.