ClickHouse中含UNION ALL的WITH子句查询报错求助
ClickHouse中WITH子句在UNION ALL场景下的表不存在问题解决方法
问题原因
ClickHouse的WITH子句作用域和PostgreSQL/MySQL存在差异,默认仅对紧跟其后的第一个SELECT语句生效。即便开启enable_global_with_statement=1,在嵌套子查询的UNION ALL结构里,该参数也无法让WITH定义的CTE跨UNION分支被访问,因此第二个select id from a会出现表不存在的错误。
解决办法
方法1:将WITH移至整个UNION ALL的外层(推荐)
把CTE定义放到最外层的WITH中,这样子查询内的两个SELECT分支都能访问到该CTE,且只会执行一次select id from student,性能最优:
with a as (select id from student) select * from ( select id from a union all select id from a )
方法2:给每个UNION分支单独定义WITH(不推荐,性能较差)
如果必须在子查询内部处理,可以给每个UNION分支单独添加WITH定义,但会重复执行两次select id from student,性能不如方法1:
select * from ( with a as (select id from student) select id from a union all with a as (select id from student) select id from a )
方法3:将CTE替换为子查询引用(备选)
把CTE直接写成子查询形式,虽能解决问题,但同样会重复查询student表:
select * from ( select id from (select id from student) a union all select id from (select id from student) a )
补充说明
enable_global_with_statement参数的作用是让WITH定义的内容在同一查询的多个顶级SELECT中生效,但对于嵌套在子查询内部的UNION ALL结构,该参数的作用范围不覆盖,所以之前开启它无法解决问题。
内容的提问来源于stack exchange,提问作者ozhang
相关产品推荐
相关产品推荐

