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 の行 のみ を返します。