SQL优化:如何将两段关联SQL合并JOIN逻辑改写为单个查询
合并CTE后的优化查询方案
你可以直接将第一个CTE的逻辑改写为第二个查询LEFT JOIN的内联子查询,不需要拆分两层CTE,合并后的完整代码如下:
SELECT is_current_period, start_date, end_date, coalesce(sum(streeteasy_page_views), 0) AS streeteasy_page_views, coalesce(sum(trulia_page_views), 0) AS trulia_page_views, coalesce(sum(zillow_page_views), 0) AS zillow_page_views, coalesce(sum(realtor_page_views), 0) AS realtor_page_views FROM periods LEFT JOIN ( SELECT clv.date, clv.streeteasy_page_views, clv.trulia_page_views, clv.zillow_page_views, clv.realtor_page_views FROM agent_insights_lt.agent_insights__combined_listing_views AS clv INNER JOIN listing_info_raw ON clv.property_id_sha = listing_info_raw.property_id_sha ) AS other_publisher_views ON other_publisher_views.date BETWEEN periods.start_date AND periods.end_date -- 原代码缺失聚合分组逻辑,按你的需求需要补充该语句 GROUP BY is_current_period, start_date, end_date
优化说明
- 原两层CTE的逻辑完全可以合并为单层查询,减少SQL解析成本,同时代码层级更清晰易读
- 补充了原代码遗漏的
GROUP BY子句,否则按周期统计的聚合逻辑会报错或得到错误结果 - 如果你的数据库支持谓词下推,该写法还会自动将日期过滤条件下推到子查询中,进一步减少扫描的数据量,提升执行效率
内容的提问来源于stack exchange,提问作者Pink Boy
相关产品推荐
相关产品推荐

