HIVE SQL如何多次复用复杂且耗时的子查询
如何复用复杂耗时的子查询?
我有一个复杂且耗时的子查询,需要附带不同条件多次调用它,想知道有没有办法复用这个子查询?我期望的写法大概是这样的:
WITH tem_table AS <SUBQUERY> SELECT col1, col2, ... coln FROM (SELECT col1, join_col FROM tem_table WHERE condition_1 )a LEFT JOIN (SELECT col2, join_col FROM tem_table WHERE condition2 )b ON a.join_col = b.join_col ... LEFT JOIN (SELECT coln, join_col FROM tem_table WHERE condition_n )n ON a.join_col = n.join_col
当然可以,你写的**CTE(公共表表达式)**写法就是复用子查询的标准方案之一,而且是最推荐的方式之一:
- CTE的核心价值:
WITH tem_table AS <SUBQUERY>会将你的复杂子查询仅执行一次(主流数据库如MySQL 8+、PostgreSQL、SQL Server等均支持该语法),后续所有子查询直接引用这个临时结果集,彻底避免重复执行原耗时子查询,能显著提升查询性能。 - 你的写法完全可行:后续通过多个子查询从
tem_table中筛选不同条件的数据再关联的思路逻辑清晰,便于后续维护和修改条件,是合理的实现方式。 - 可选优化方向:如果各个子查询的关联字段
join_col一致,也可以用条件聚合简化写法,减少关联操作,示例如下:
WITH tem_table AS <SUBQUERY> SELECT MAX(CASE WHEN condition_1 THEN col1 END) AS col1, MAX(CASE WHEN condition_2 THEN col2 END) AS col2, ... MAX(CASE WHEN condition_n THEN coln END) AS coln FROM tem_table GROUP BY join_col
这种写法代码更简洁,性能表现可能更优,你可以根据实际业务场景选择合适的实现方式。
内容的提问来源于stack exchange,提问作者Sean.H
相关产品推荐
相关产品推荐

