使用 ROracle 包一次查询两个相关的 Oracle 表



我有一个功能性 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 文档仅包含非常简单的查询示例。

只需对列别名两边的双引号进行转义,因为您对 R 字符串使用双引号。Oracle 在节点 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'")

更好地使用 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)

相关内容

  • 没有找到相关文章

最新更新