すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:SEMI JOIN

最終更新日:Aug 21, 2026

MaxCompute は LEFT SEMI JOIN と LEFT ANTI JOIN をサポートしており、右テーブルに一致する行が存在するかどうかに基づいて左テーブルから行をフィルターします。本トピックでは、これらの構文と使用例について説明します。

仕組み

MaxCompute は以下の SEMI JOIN 操作をサポートしています。

  • LEFT SEMI JOIN

    右テーブルに一致する行が存在する、左テーブルの行を返します。これは IN サブクエリ に相当します。

  • LEFT ANTI JOIN

    右テーブルに一致する行が存在しない、左テーブルの行を返します。これは NOT IN サブクエリ に似ていますが、完全に同一ではありません。

両方の操作は、パフォーマンス向上のために MAPJOIN ヒント をサポートしています。

制限事項

右テーブルは結合条件 (ON 句) でのみ参照でき、WHERE 句や SELECT 句では参照できません。

サンプルデータ

-- パーティションテーブル「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
);

-- ソーステーブルにパーティションを追加します。
ALTER TABLE sale_detail ADD PARTITION (sale_date='2026', region='china');
ALTER TABLE sale_detail_sj ADD PARTITION (sale_date='2026', region='china');

-- ソーステーブルにデータを挿入します。
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);

使用例

LEFT SEMI JOIN の例

この例では、sale_detail テーブルから、sale_detail_sj テーブルに一致する total_price がある行をすべて検索します。

SELECT * FROM sale_detail a
LEFT SEMI JOIN sale_detail_sj b
  ON a.total_price = b.total_price;
  
-- 返された結果:
+-----------+-------------+-------------+-----------+--------+
| shop_name | customer_id | total_price | sale_date | region |
+-----------+-------------+-------------+-----------+--------+
| s1        | c1          | 100.1       | 2026      | china  |
| s2        | c2          | 100.2       | 2026      | china  |
+-----------+-------------+-------------+-----------+--------+

sale_detail_sj に 一致する total_price がある、sale_detail の行 のみ を返します。

LEFT ANTI JOIN の例

この例では、sale_detail テーブルから、sale_detail_sj テーブルに一致する total_price がない行をすべて検索します。

SELECT * FROM sale_detail a
LEFT ANTI JOIN sale_detail_sj b
  ON a.total_price = b.total_price;
  
-- 返された結果:
+-----------+-------------+-------------+-----------+--------+
| shop_name | customer_id | total_price | sale_date | region |
+-----------+-------------+-------------+-----------+--------+
| s3        | c3          | 100.3       | 2026      | china  |
+-----------+-------------+-------------+-----------+--------+

sale_detail_sj に一致する total_price が ない、sale_detail の行 のみ を返します。