Tüm Ürünler
Search
Belge Merkezi

MaxCompute:SEMI JOIN

Son Güncelleme:Oct 10, 2026

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.