[英]How to join tables from different SQL databases using R and dplyr?
我使用的是dplyr (0.7.0)
, dbplyr (1.0.0)
, DBI 0.6-1
和odbc (1.0.1.9000)
。 我想做类似以下的事情:
db1 <- DBI::dbConnect(
odbc::odbc(),
Driver = "SQL Server",
Server = "MyServer",
Database = "DB1"
)
db2 <- DBI::dbConnect(
odbc::odbc(),
Driver = "SQL Server",
Server = "MyServer",
Database = "DB2"
)
x <- tbl(db1, "Table1") %>%
dplyr::left_join(tbl(db2, "Table2"), by = "JoinColumn")
但我一直得到一个似乎没有任何实质内容的错误。 当我使用show_query
,似乎代码正在尝试创建一个SQL查询,该查询连接两个表而不考虑单独的数据库。 根据dplyr::left_join
的文档,我也尝试过:
x <- tbl(db1, "Table1") %>%
dplyr::left_join(tbl(db2, "Table2"), by = "JoinColumn", copy = TRUE)
但输出或错误消息没有变化。 是否有不同的方法从同一服务器上的不同数据库连接表?
我假设您提供的代码(a)您有兴趣在运行collect()
之前通过dplyr
的语法加入两个tbl
对象并将结果拉入本地内存并且(b)您想要引用直接调用tbl()
的数据库对象。
如果您想利用dplyr
以编程方式构建查询逻辑,同时利用数据库服务器将大量数据下载到您感兴趣的集合中,这些选择很重要。(或者至少这就是为什么我在这里结束了。)
我找到的解决方案使用一个连接而不指定数据库,并使用in_schema()
数据库和架构信息(我无法在任何地方找到此文档或in_schema()
晕):
conn <- DBI::dbConnect(
odbc::odbc(),
Driver = "SQL Server",
Server = "MyServer"
)
x <- tbl(src_dbi(conn),
in_schema("DB1.dbo", "Table1")) %>%
dplyr::left_join(tbl(src_dbi(conn),
in_schema("DB1.dbo", "Table2")),
by = "JoinColumn")
我会使用merge()
函数来执行表上的左连接。 它将类似于x <- merge(df1, df2, by = "JoinColumn", all.x = TRUE)
。
我遇到了同样的问题,我无法用dplyr :: left_join解决它。
至少我能够使用以下解决方法完成这项工作。 我连接到SQL Server而没有声明默认数据库,然后我用sql()运行查询。
con <- dbConnect(odbc::odbc(), dsn="DWH" , uid="", pwd= "" )
data_db <- tbl( con, sql("SELECT *
FROM DB1..Table1 AS a
LEFT JOIN DB2..Table2 AS b ON a.JoinColumn = b.JoinColumn") )
data_db%>%...
希望能帮助到你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.