【问题标题】:RODBC: merge tables from different databases (channel)RODBC:合并来自不同数据库的表(通道)
【发布时间】:2013-12-19 18:22:15
【问题描述】:

我正在使用 RODBC 包从 R 连接到 Oracle 数据库,但我没有成功合并来自不同数据库的表而没有“下载”表(我不想下载它们,因为它们太大了!) .我想使用类似的东西:

DBa=odbcConnect(dsn="DatabaseA",uid="uid",pwd="pwd",readOnly="True")
DBb=odbcConnect(dsn="DatabaseB",uid="uid",pwd="pwd",readOnly="True")
sqldf("select a.year, sum(b.var) as sumVar
       from sqlFetch(DBa,'tableA') a
            sqlFetch(DBb,'tableB') b
       where a.ID=b.ID
       group by a.year")

如果有人有想法,那将非常有帮助!非常感谢。

莱昂内尔

【问题讨论】:

  • sqldf 用于在数据帧上使用 SQL。它使用数据库作为后端来执行此操作,但它不用于访问数据库(尽管可以通过一些努力来完成,但这不是预期的应用程序)。在任何情况下它都不支持 Oracle、RODBC 或 ODBC。它支持 SQLite ()default)、H2、MySQL 和 PostgreSQL。

标签: sql r rodbc sqldf


【解决方案1】:

这个问题类似于问题here。答案似乎是 RODBC 无法在单个查询中访问两个不同的数据库,使用 sqlQuery(...),因为连接(通道)是特定于数据库的。所以要么

(1) do it using downloads (as in your code), or 
(2) have your DBA put both tables in a single database, or 
(3) use something other than R. 

【讨论】:

    【解决方案2】:

    在 Netezza 中使用 sqlQuery 函数可以正常工作。

    require("RODBC")
    
    ch <- odbcConnect("NZSQL")
    
    dim.cust.acc1  <- sqlQuery(ch,"Select * from DB1..DIM_ACCOUNT a inner join DB2..BASE_201707 b on a.id_number=b.id_number limit 1000",believeNRows = FALSE)
    

    【讨论】:

      【解决方案3】:

      我不能评论其他答案或支持@abdul mohammad,但他是对的。我刚刚做了一个复杂的查询,最多合并了 4 个不同的数据库。检查你的sintax。您可以调用不同的数据库,例如

      select * from TableInTheConnection A
      left join [server ip].TableInOtherConnection B 
      ...
      

      【讨论】:

      • 欢迎来到 SO,如果您不能发表评论,请不要使用答案
      • 但是问的人可能只是语法有问题。这就是我回答的原因。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-30
      • 2013-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多