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

时间:2019-02-11 19:33:46

标签: sql r oracle roracle

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

1 个答案:

答案 0 :(得分:0)

因为对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'")

使用DBI::sqlInterpolate甚至更好 parameterize进行查询,并避免任何引号引起来。与逗号分隔的表格相比,以下还使用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)