SQL使用CTE与INNER JOIN查询时报t1.commune列不存在错误如何解决
错误原因
- 直接原因:两个CTE
P1、P2的SELECT子句仅返回了计数统计字段,没有将分组依据commune字段加入返回列表。即使你在GROUP BY中指定了按dvf1.commune分组,CTE的结果集也只会保留SELECT后明确声明的字段,因此P1、P2的结构中不存在commune列,关联时触发字段不存在报错。 - 冗余问题:
FROM import.dvf1, (SELECT commune FROM import.dvf1) as commune的写法会让主表和子查询生成笛卡尔积,会导致计数结果远大于实际值,属于完全无用的冗余逻辑。
修复方案
最小改动版本(保留原有双CTE的写法)
仅在两个CTE的SELECT中补充commune字段、删除冗余的笛卡尔积逻辑即可:
WITH P1 as ( SELECT commune, count(*) as Premier_trimestre FROM import.dvf1 WHERE date_mutation BETWEEN '2020-01-01' AND '2020-03-31' GROUP BY commune ), P2 as ( SELECT commune, count(*) as Deuxieme_trimestre FROM import.dvf1 WHERE date_mutation BETWEEN '2020-04-01' AND '2020-06-30' GROUP BY commune ) SELECT * FROM P1 t1 INNER JOIN P2 t2 ON t1.commune = t2.commune
优化写法(推荐,仅扫描一次表性能更高)
使用条件聚合替代双CTE关联,无需额外关联操作,执行效率更高:
SELECT commune, COUNT(CASE WHEN date_mutation BETWEEN '2020-01-01' AND '2020-03-31' THEN 1 END) as Premier_trimestre, COUNT(CASE WHEN date_mutation BETWEEN '2020-04-01' AND '2020-06-30' THEN 1 END) as Deuxieme_trimestre FROM import.dvf1 WHERE date_mutation BETWEEN '2020-01-01' AND '2020-06-30' GROUP BY commune
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

