公開日: 2026-05-15
R2 SQL が JOIN、サブクエリ、マルチテーブルクエリをサポート
概要
R2 SQL は Cloudflare のサーバーレス分散型 SQL エンジンで、R2 Data Catalog に格納された Apache Iceberg ↗ テーブルをクエリできます。R2 SQL は Cloudflare のグローバルネットワーク上で直接実行され、インフラ管理は不要のため、データを外部のデータウェアハウスにエクスポートすることなく R2 上のデータを解析できます。
今回のアップデートにより、複数の Iceberg テーブルを単一のクエリで結合できるようになりました。JOIN、サブクエリ、マルチテーブル CTE(WITH 句)を組み合わせて、複雑な分析クエリを構築できます。
新機能(主な対応項目)
- 結合(JOIN)
INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN, CROSS JOIN
- 暗黙の結合(FROM をカンマ区切りにし WHERE に条件を記述)
- サブクエリ
IN / NOT IN, EXISTS / NOT EXISTS
- SELECT / WHERE / HAVING 内のスカラーサブクエリ
- 派生テーブル(FROM 内のサブクエリ)
- マルチテーブル CTE
WITH 句で複数のテーブルを参照し、JOIN を含めることが可能
- セルフジョイン(同一テーブルを別名で自己結合)
- マルチウェイジョイン(3 テーブル以上を単一クエリで結合)
例
Two-table JOIN with aggregation
SELECT z.domain, z.plan, COUNT(*) AS request_count
FROM my_namespace.zones z
INNER JOIN my_namespace.http_requests h ON z.zone_id = h.zone_id
WHERE z.plan =
GROUP BY z.domain, z.plan
ORDER BY request_count DESC
LIMIT 20
EXISTS サブクエリ
SELECT z.domain, z.plan
FROM my_namespace.zones z
WHERE EXISTS (
SELECT 1
FROM my_namespace.firewall_events f
WHERE f.zone_id = z.zone_id
AND f.action = 'block'
)
ORDER BY z.domain
LIMIT 20
マルチテーブル CTE と JOIN
WITH top_zones AS (
SELECT zone_id, COUNT(*) AS req_count
FROM my_namespace.http_requests
GROUP BY zone_id
ORDER BY req_count DESC
LIMIT 50
), zone_threats AS (
SELECT zone_id, COUNT(*) AS threat_count
FROM my_namespace.firewall_events
WHERE risk_score > 0.5
GROUP BY zone_id
)
SELECT tz.zone_id, tz.req_count, COALESCE(zt.threat_count, 0) AS threat_count
FROM top_zones tz
LEFT JOIN zone_threats zt ON tz.zone_id = zt.zone_id
ORDER BY tz.req_count DESC
LIMIT 20
参照
- 完全な構文リファレンスは SQL リファレンス を参照してください。
- 結合のパフォーマンスに関するガイダンスは "Limitations and best practices" を参照してください。