CrateDB如何避免嵌套SELECT语句中重复选择列以展示结果?
在CrateDB中避免嵌套查询重复选择列的方法
当然可以,而且还能顺便优化查询性能,减少对目标表的扫描次数。下面提供两种实用方案:
方案1:使用CTE(公共表表达式)
CTE能一次性定义好A和B的计算结果,后续所有逻辑直接引用,不用重复嵌套选择。同时可以把原查询中两次独立的count(*)子查询改成条件聚合,只扫描一次表就能得到A和B,性能更优:
WITH base_counts AS ( SELECT COUNT(CASE WHEN process_state = 'State_1' THEN 1 END) AS A, COUNT(CASE WHEN process_state = 'State_2' THEN 1 END) AS B FROM schema.table_01 ) SELECT A, B, A + B AS AB, A * B * (A + B) AS ABAB, A / (A + B)::DECIMAL AS AAB FROM base_counts;
这里base_counts CTE只计算一次A和B,外层查询直接用这两个值推导所有衍生字段,完全不用重复选择A和B,同时还把原查询的两次表扫描缩减为一次。
方案2:简化嵌套子查询(不用CTE)
如果不想用CTE,也可以把所有计算逻辑合并到一层子查询之后,只需要一次嵌套就搞定:
SELECT A, B, A + B AS AB, A * B * (A + B) AS ABAB, A / (A + B)::DECIMAL AS AAB FROM ( SELECT COUNT(CASE WHEN process_state = 'State_1' THEN 1 END) AS A, COUNT(CASE WHEN process_state = 'State_2' THEN 1 END) AS B FROM schema.table_01 ) base_counts;
原查询的多层嵌套完全是多余的——中间层只是计算AB,这个步骤直接放到外层完成即可,这样就避免了在嵌套中重复选择A和B的问题。
内容的提问来源于stack exchange,提问作者drypatrick
相关产品推荐
相关产品推荐

