SQLite查询报错:near « ) » : syntax error 求助
SQLite查询语法错误排查与修正
错误原因分析
- CTE字段与GROUP BY不匹配:CTE
valeur_par_ville的SELECT子句包含com_code,但GROUP BY子句使用的是com_id,非聚合列必须出现在GROUP BY中,两者不统一导致逻辑错误。 - 子查询引用不存在的字段:子查询尝试从CTE中获取
com_nom和valeur_fonciere,但CTE仅生成了dep_code、com_id、valeur(平均房价)这三个字段——valeur_fonciere是原始表字段,经AVG聚合后已不存在;com_nom未在CTE中被选中。 - 外层查询引用未暴露的字段:外层SELECT中的
com_id未在子查询的SELECT列表中声明,导致无法访问该字段。
修正后的查询语句
WITH valeur_par_ville AS ( SELECT dep_code, commune.com_id, com_nom, AVG(valeur_fonciere) as valeur FROM vente JOIN bien ON bien.bien_id = vente.bien_id JOIN commune ON commune.com_id = bien.com_id WHERE dep_code IN (6,13,33,59,69) GROUP BY dep_code, commune.com_id, com_nom ) SELECT dep_code AS "Département", com_nom AS "Commune", round(valeur,1) AS "Prix moyen" FROM( SELECT dep_code, com_id, com_nom, valeur, rank() OVER (PARTITION BY dep_code ORDER BY valeur DESC) AS rang FROM valeur_par_ville) AS result WHERE rang <= 3 ORDER BY dep_code, rang;
关键修正说明
- 统一CTE字段与GROUP BY:将SELECT中的
com_code改为commune.com_id,同时加入com_nom字段并添加到GROUP BY中,确保符合SQL标准,避免字段歧义。 - 修正子查询字段引用:仅选取CTE中实际存在的字段,基于聚合后的
valeur(平均房价)进行排名,而非原始的valeur_fonciere。 - 确保字段可访问:子查询中包含外层需要的
com_id、com_nom等字段,避免引用错误。 - 添加
ORDER BY子句:让结果按省份代码和排名排序,输出更直观。
内容的提问来源于stack exchange,提问作者Robin Talbot
相关产品推荐
相关产品推荐

