SQL基于多CTE关联查询结果执行后续操作的高效实现方案
多CTE关联结果后续查询的高效实现方案
你不需要使用嵌套WITH语法,SQL标准的WITH子句本身支持连续定义多个CTE,后定义的CTE可以直接引用前面所有已定义的CTE,以下是三种常用实现方式:
- 方法1:同WITH块追加关联结果CTE(通用、可读性最高)
把你原来的多表关联逻辑封装成一个独立CTE,后续所有查询逻辑直接基于这个CTE开发即可,性能和原写法完全一致,所有支持CTE的数据库都兼容该写法:WITH cte1 as(....), cte2 as(....), cte3 as (...), -- 新增CTE存储原有多表关联的全量结果 cte_join_result AS ( select * from cte1 left join cte2 on cte1.col1=cte2.col2 left join cte3 on cte1.col2=cte3.col3 ) -- 此处编写后续过滤、聚合、排序等业务逻辑 SELECT col1, col2, COUNT(*) AS cnt FROM cte_join_result WHERE -- 补充你的过滤条件 create_time >= '2024-01-01' AND status = 1 GROUP BY col1, col2 ORDER BY cnt DESC
- 方法2:子查询嵌套(适合单层简单加工场景)
如果后续只需要做一层简单过滤,也可以直接把原关联逻辑作为子查询嵌套在外层查询中,无需额外定义CTE:WITH cte1 as(....), cte2 as(....), cte3 as (...) SELECT * FROM ( select * from cte1 left join cte2 on cte1.col1=cte2.col2 left join cte3 on cte1.col2=cte3.col3 ) AS t_join WHERE -- 补充过滤条件
- 方法3:临时表固化结果(适合大结果集多轮复用场景)
如果你的关联结果数据量特别大,且需要基于该结果做多次不同的查询加工,可以先把关联结果写入临时表,后续所有查询直接读取临时表即可,避免重复执行关联逻辑浪费资源:-- 第一步:生成关联结果临时表 CREATE TEMP TABLE tmp_join_result AS WITH cte1 as(....), cte2 as(....), cte3 as (...) select * from cte1 left join cte2 on cte1.col1=cte2.col2 left join cte3 on cte1.col2=cte3.col3; -- 第二步:基于临时表执行任意查询 SELECT * FROM tmp_join_result WHERE ...;
内容的提问来源于stack exchange,提问作者Eric
相关产品推荐
相关产品推荐

