R 3.3.3运行含WITH子句的sqldf查询报错的解决方案
问题根因
这个报错和R本身的版本没有直接关联,核心原因是R 3.3.3环境下sqldf依赖的RSQLite版本过旧:
- 旧版
RSQLite内嵌的SQLite引擎版本低于3.8.3,而WITH子句(CTE公共表表达式)是SQLite 3.8.3才正式支持的语法,因此旧引擎无法解析以WITH开头的查询语句 - 附带的
Quoted identifiers should have class SQL是旧版DBI接口的兼容提示,不会直接导致语句执行失败
解决方案
方案1:改写SQL规避WITH语法(兼容性最好,无需升级依赖)
直接把CTE逻辑替换为嵌套子查询,所有版本的SQLite都能支持,改写后的代码运行结果和原语句完全一致:
sqldf("SELECT * FROM (SELECT cyl, avg(mpg) as avg_mpg FROM mtcars GROUP BY cyl)")
这种方案不需要改动现有环境的任何包版本,适合不能随意调整依赖的生产/稳定环境使用。
方案2:升级RSQLite到支持CTE的版本
如果不想改写原有SQL逻辑,可以在R 3.3.3环境中将RSQLite升级到内嵌SQLite版本≥3.8.3的适配版本,升级完成后重启R会话,原带WITH子句的查询就可以正常运行。
注意:如果是从源码安装包,需要提前配置好对应R 3.3.3版本的编译工具链(Windows环境安装Rtools3.3,macOS环境安装Xcode命令行工具即可)。
方案3:切换sqldf的数据库后端
sqldf默认使用SQLite作为执行引擎,也支持手动配置为PostgreSQL、MySQL等其他原生支持WITH语法的数据库后端,不过这种方案需要额外本地安装配置对应数据库服务,成本较高,非必要不推荐。
内容的提问来源于stack exchange,提问作者user3155618
相关产品推荐
相关产品推荐

