11

我正在使用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) 

但是输出或错误消息没有变化。是否有不同的方法可以在同一台服务器上连接来自不同数据库的表?

4

3 回答 3

13

我从您提供的代码中假设(a)您有兴趣在运行之前通过's 语法连接两个tbl对象并将结果拉入本地内存,并且(b)您想直接引用数据库对象在调用.dplyrcollect()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")
于 2018-03-31T21:13:24.983 回答
2

我遇到了同样的问题,我无法用 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") ) 

数据数据库 %>% ...

希望能帮助到你。

于 2017-10-19T08:56:30.127 回答
-3

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

于 2017-06-22T15:40:13.937 回答