跳转到内容
搜索文档

更新日志

Cloudflare 的最新更新与改进。

Back to all posts

R2 SQL 现在支持 JOIN、子查询和多表查询

R2 SQL 是 Cloudflare 的无服务器分布式 SQL 引擎,用于查询存储在 R2 Data Catalog 中的 Apache Iceberg 表。R2 SQL 直接在 Cloudflare 的全球网络上运行,无需管理任何基础设施,因此您可以分析 R2 中的数据,而无需将其导出到外部仓库。

R2 SQL 现在支持在单个查询中连接多个 Iceberg 表。您可以使用 JOIN 组合表,使用子查询进行过滤,并定义多表 CTE 以构建复杂的分析查询。

新功能

  • JOININNER JOINLEFT JOINRIGHT JOINFULL OUTER JOINCROSS JOIN 以及隐式连接(FROM 中以逗号分隔,且条件在 WHERE 中)
  • 子查询IN / NOT INEXISTS / NOT EXISTSSELECT / WHERE / HAVING 中的标量子查询,以及派生表(FROM 中的子查询)
  • 多表 CTEWITH 子句可以引用不同的表并包含 JOIN
  • 自连接 — 使用不同的别名将表与自身连接
  • 多路连接 — 在单个查询中连接三个或更多表

示例

带有聚合的双表 JOIN

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

带有 JOIN 的多表 CTE

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 参考。有关连接性能指南,请参阅限制与最佳实践