如何使用R和dplyr连接来自不同SQL数据库的表?

sta*_*ent 7 sql-server r dplyr dbplyr

我使用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") 
Run Code Online (Sandbox Code Playgroud)

但我一直得到一个似乎没有任何实质内容的错误.当我使用show_query它时,似乎代码正在尝试创建一个连接两个表的SQL查询,而不考虑单独的数据库.根据dplyr::left_join我的文档,我也尝试过:

x <- tbl(db1, "Table1") %>%
      dplyr::left_join(tbl(db2, "Table2"), by = "JoinColumn", copy = TRUE) 
Run Code Online (Sandbox Code Playgroud)

但输出或错误消息没有变化.是否有不同的方法从同一服务器上的不同数据库连接表?

ish*_*hak 9

我从您提供的代码中假设 (a) 您有兴趣在运行之前tbl通过dplyr的语法连接两个对象并将结果拉入本地内存,并且 (b) 您想直接引用数据库对象在调用.collect()tbl()

如果您想利用dplyr以编程方式构建查询逻辑,同时利用数据库服务器将大量数据 INNER JOIN 到您感兴趣的集合,那么这些选择很重要。(或者至少这就是我结束这里的原因。 )

我找到的解决方案使用一个连接而不指定数据库,并使用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")
Run Code Online (Sandbox Code Playgroud)


小智 -3

我将使用该merge()函数在表上执行左连接。它会是类似的东西x <- merge(df1, df2, by = "JoinColumn", all.x = TRUE)

  • 我不相信“merge()”能够像“left_join()”这样的“dplyr”函数那样与“dbplyr”和数据库连接一起使用。 (5认同)