使用 ROracle 包一次查询两个相关的 Oracle 表
Querying two related Oracle tables at once with ROracle package
我有一个功能性 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.
之间为 space 抛出错误
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 中使用双引号的列别名中使用 spaces:
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
并避免 any 引号转义。下面还使用 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)
我有一个功能性 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.
之间为 space 抛出错误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 中使用双引号的列别名中使用 spaces:
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
并避免 any 引号转义。下面还使用 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)