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

问题描述 投票:0回答:3

我正在使用

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) 

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

sql-server r dplyr dbplyr
3个回答
18
投票

我从您提供的代码中假设(a)您有兴趣通过

tbl
的语法连接两个
dplyr
对象 before 您运行
collect()
并将结果拉入本地内存,并且(b) 您希望在调用中直接引用数据库对象
tbl()

如果您想利用

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

我找到的解决方案使用一个连接而不指定数据库,并使用

in_schema()
拼出数据库和架构信息(我在任何地方都找不到此文档或插图):

conn <- DBI::dbConnect(
  odbc::odbc(),
  Driver = "SQL Server",
  Server = "MyServer"
)

x <- conn %>%
  dplyr::tbl("Table1") %>%
  dplyr::left_join(
    .,
    conn %>%
      dplyr::tbl("Table2"),
    by = "JoinColumn")
    )

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") ) 

数据数据库%>% ...

希望有帮助。


-3
投票

我将使用

merge()
函数在表上执行左连接。类似于
x <- merge(df1, df2, by = "JoinColumn", all.x = TRUE)

© www.soinside.com 2019 - 2024. All rights reserved.