如何用dbplyr在数据库端通过查询结果创建表?
问题描述
假设已通过以下方式建立数据库连接并关联大型表:
library(tidyverse) conn <- ROracle::dbConnect(drv, dbname = "IPIAMPR2.WORLD") patients <- tbl(conn, "patients")
可执行如下查询:
young <- patients %>% filter(age < 18)
再将结果复制到数据库:
copy_to(conn, young, "young")
现咨询:是否可实现等效于如下SQL的操作,让所有工作在数据库端完成?
create table YOUNG select * from PATIENTS where AGE < 18
解决方案
当然可以,有两种常用方式实现全数据库端操作,完全等效你给出的SQL逻辑,且不会把数据拉取到本地再写入:
方法一:使用tidyverse工具链实现
通过dplyr的数据库操作函数,全程在数据库内完成表创建与数据插入:
# 构建过滤逻辑的查询对象(仅生成查询计划,不会拉取数据到本地) young_query <- patients %>% filter(age < 18) # 在数据库端创建与查询结果结构匹配的表 dplyr::db_create_table(conn, "YOUNG", fields = dplyr::db_fields(young_query)) # 将查询结果直接插入新表(操作完全在数据库内执行) dplyr::db_insert_into(conn, "YOUNG", young_query)
方法二:直接执行原生SQL语句
如果更习惯原生SQL写法,直接用DBI包执行目标SQL即可,这是最直接等效原SQL的方式:
DBI::dbExecute(conn, "CREATE TABLE YOUNG AS SELECT * FROM PATIENTS WHERE AGE < 18")
两种方法都适合处理大型表场景,所有计算和表创建操作均在数据库端完成,不会占用本地资源。
内容的提问来源于stack exchange,提问作者pietrodito
相关产品推荐
相关产品推荐

