我正在使用
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)您有兴趣通过
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")
)
我遇到了同样的问题,但无法使用 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") )
数据数据库%>% ...
希望有帮助。
我将使用
merge()
函数在表上执行左连接。类似于 x <- merge(df1, df2, by = "JoinColumn", all.x = TRUE)
。