【问题标题】:Querying two related Oracle tables at once with ROracle package使用 ROracle 包一次查询两个相关的 Oracle 表
【发布时间】:2019-07-05 09:00:29
【问题描述】:

我有一个功能性 SQL 查询,它从 Oracle 数据库中的两个相关表中提取数据,如下所示(虚拟查询):

SELECT
OP.FIELD_1 AS "Trade Date",
L.FIELD_2 AS "Node ID"

FROM
TABLE_1 OP,
TABLE_2 L

WHERE
OP.FIELD_1 = '12-JAN-2019'

是否可以在 ROracle 框架中使用此查询?我无法让它工作,我不知道是不是因为它不可能,我的查询格式不正确等等。我尝试了很多事情,但这是我尝试过的一个例子(虚拟查询) :

library(ROracle) 

# Connect to database 
con <- dbConnect(drv, username = "username",
             password = "pass",
             dbname = "database_name")

# Query the database
res <- dbSendQuery(con "SELECT OP.FIELD_1 AS Trade Date,
                              L.FIELD_2 AS Node ID
                       FROM TABLE_1 OP,
                            TABLE_2 L
                       WHERE OP.FIELD_1 = '12-JAN-2019'")

我的数据库连接工作正常,我可以从其中任何一个表中查询,但不能以这种格式一起查询。任何帮助将不胜感激! ROracle 文档只包含非常简单的查询示例。

【问题讨论】:

  • 连接数据库的任何合规查询都可以在dbSendQuery中工作。你收到什么错误?另外,我认为 SQL 语句周围缺少的引号是这篇文章中的一个错字。
  • 谢谢我修正了引号 - 这个例子的错误是:错误:意外的字符串常量在:FROM TABLE_1 OP, TABLE_2 L WHERE OP.FIELD_1 = '12-JAN-2019'"。但是如果你有一个使用这个包的功能查询的例子,它可以做我想做的事情,我会很感激看到它。

标签: sql r oracle roracle


【解决方案1】:

由于您对 R 字符串使用双引号,因此只需在列别名周围转义双引号。 Oracle 为 Node ID 之间的空间抛出错误。

res <- dbSendQuery(con, "SELECT OP.FIELD_1 AS \"Trade Date\",
                              L.FIELD_2 AS \"Node ID\"
                         FROM TABLE_1 OP,
                              TABLE_2 L
                         WHERE OP.FIELD_1 = '12-JAN-2019'")

或者,将 R 字符串用单引号括起来,并在 WHERE 中转义单引号:

res <- dbSendQuery(con, 'SELECT OP.FIELD_1 AS "Trade Date",
                              L.FIELD_2 AS "Node ID"
                         FROM TABLE_1 OP,
                              TABLE_2 L
                         WHERE OP.FIELD_1 = \'12-JAN-2019\'')

更重要的是,避免列别名中的空格需要在 Oracle 中使用双引号:

res <- dbSendQuery(con, "SELECT OP.FIELD_1 AS Trade_Date,
                              L.FIELD_2 AS Node_ID
                         FROM TABLE_1 OP,
                              TABLE_2 L
                         WHERE OP.FIELD_1 = '12-JAN-2019'")

甚至更好 parameterize 使用DBI::sqlInterpolate 查询并避免任何 引号转义。下面还使用CROSS JOIN 比逗号分隔表更明确、更受欢迎的版本:

library(ROracle) 
library(DBI)

...
sql <- sqlInterpolate(con, "SELECT OP.FIELD_1 AS Trade_Date,
                                   L.FIELD_2 AS Node_ID
                            FROM TABLE_1 OP
                            CROSS JOIN TABLE_2 L
                            WHERE OP.FIELD_1 = ?param",
                      param = "12-JAN-2019")

res <- dbGetQuery(con, sql)

【讨论】:

  • 感谢您提供全面而实用的回复!
  • 最后一个解决方案对您有用吗?有一个 StackOverflow way of saying so
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 2020-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多