OpenAICloudflare Developer Platform2026/05/15 0:00

R2 SQL - R2 SQL now supports JOINs, subqueries, and multi-table queries

要点だけを先に読めるように短く再構成したセクションです。

元記事

Quick Digest

要約

要点だけを先に読めるように短く再構成したセクションです。

openaijamodel: gpt-5-mini-2025-08-07

R2 SQL が JOIN・サブクエリ・マルチテーブルクエリをサポート

Key Points

  • JOIN対応
  • サブクエリ対応
  • マルチテーブルCTE

Summary

R2 SQL(Cloudflare のサーバーレス分散 SQL エンジン)が、R2 上の Apache Iceberg テーブルに対して JOIN、サブクエリ、複数テーブルを参照する CTE をサポートします。インフラ管理不要でグローバルネットワーク上で直接クエリを実行できるため、外部ウェアハウスへのデータ移行を減らして分析できます。

Key Points

  • 対応 JOIN: INNER、LEFT、RIGHT、FULL OUTER、CROSS、暗黙のカンマ結合(FROM のカンマ + WHERE 条件)
  • サブクエリ: IN/NOT IN、EXISTS/NOT EXISTS、SELECT/HAVING のスカラーサブクエリ、FROM 内の派生テーブル
  • マルチテーブル CTE: WITH 句で別テーブルを参照し、CTE 内で JOIN を含められる
  • セルフジョイン / マルチウェイジョイン: 同一テーブルの別エイリアスや 3 テーブル以上の結合をサポート
  • 実例: 二表 JOIN(集計)、EXISTS サブクエリ、JOIN を含む複数 CTE(ドキュメントにクエリ例あり)
  • パフォーマンス注意点: 大規模結合ではフィルタリング、必要カラム限定、LIMIT の活用と「Limitations and best practices」を参照

Practical tips

  • まず小さな結果セットで EXISTS や LIMIT を試し、スケール時のコストを確認する
  • 必要なカラムだけ選ぶことで読み取りデータ量を削減する

参照: SQL リファレンス、Limitations and best practices

Full Translation

翻訳

原文の流れを保ったまま読める翻訳セクションです。

openaijamodel: gpt-5-mini-2025-08-07

R2 SQL — JOIN、サブクエリ、マルチテーブルクエリをサポート

公開日: 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 = 'enterprise'
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" を参照してください。