繁体   English   中英

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

[英]How to join tables from different SQL databases using R and dplyr?

我使用的是dplyr (0.7.0)dbplyr (1.0.0)DBI 0.6-1odbc (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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM