MonetDB中使用WITH子句的SQL查询执行报错是什么原因?
你的SQL语句存在两处核心问题:
- 语法逻辑错误:你通过WITH定义了公共表表达式(CTE)
a后,既没有将a加入主查询的FROM子句建立关联,也没有在IN子句中通过子查询引用a的结果,直接写t.data_string in (a.data_string)属于无效语法,数据库无法识别a的上下文,因此会抛出字段/表不存在的报错。 - 逻辑冗余:你已经在FROM子句中引入了
colombia.dim_tempo t,且通过f.cod_anomes = t.data_string做了关联条件,此时t.data_string本身就全部来自dim_tempo表,额外定义CTE取同表的data_string再做IN判断没有任何实际过滤作用,属于多余逻辑。
修复方案
如果你需要保留CTE做语法测试,正确写法为在IN子句中通过子查询引用CTE结果:
with a as (select data_string from colombia.dim_tempo) select t.ano_mes ,f.sg_estado ,f.cod_produto , sum(f.qtd_vendidas) as qtd_vendidas , count(*) as fact_count from colombia.fact_retail_market f, colombia.dim_tempo t where f.cod_anomes = t.data_string and t.data_string in (select data_string from a) group by t.ano_mes ,f.sg_estado ,f.cod_produto ;
如果是实际业务使用,直接删除多余的CTE和IN判断即可,简化后的SQL执行效率更高:
select t.ano_mes ,f.sg_estado ,f.cod_produto , sum(f.qtd_vendidas) as qtd_vendidas , count(*) as fact_count from colombia.fact_retail_market f, colombia.dim_tempo t where f.cod_anomes = t.data_string group by t.ano_mes ,f.sg_estado ,f.cod_produto ;
内容的提问来源于stack exchange,提问作者Llorieb
相关产品推荐
相关产品推荐

