Запрос двух связанных таблиц Oracle одновременно с пакетом ROracle - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть функциональный запрос 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 голосов
/ 11 февраля 2019

Просто избегайте двойных кавычек вокруг псевдонимов столбцов, поскольку вы используете двойные кавычки для 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)
...