2012-11-26 2 views
2

Я пытаюсь выполнить запрос или форму:RJDBC запросов из списков значений индексов

SELECT a.col1, b.col2 FROM tbl1 a, tbl2 b 
WHERE a.col2 = b.col1 
AND a.col3 = df$x 
AND a.col4 = df$y 

На базе Oracle с использованием RJDBC. У меня есть кадр данных с столбцами x и y, которые идентифицируют. Я не могу найти никаких подробностей о том, как создавать и выполнять запрос для отдельных значений в моем фрейме данных.

Мой кадр данных имеет вид:

df <- data.frame(x=c("LIB258", "LIB258", "LIB359"), y=c("A01", "B03", "C08")) 

Так что я нужен способ, чтобы генерировать и последовательно работать три различных запросов, а затем собирать результаты в кадр данных.

Есть ли элегантный способ сделать это в R? Я знаю, что могу использовать немного магии paste для создания отдельных запросов, но как же их запустить и вернуть результаты в dataframe?

Благодаря Hassan

ответ

2

с помощью plyr и вставить

library(plyr) 
dff <- data.frame(x=c("LIB258", "LIB258", "LIB359"), y=c("A01", "B03", "C08")) 
ddply(dff,.(x,y), 
      function(rr){ 
      query <- paste("SELECT a.col1, b.col2 FROM tbl1 a, tbl2 b ", 
         "WHERE a.col2 = b.col1", 
         paste("AND a.col3 = ",rr$x,sep=''), 
         paste("AND a.col4 = ",rr$y,sep=''),sep ='\n') 

      result <- dbGetQuery(conn, query) 
      }) 

this should retuen something like : 

    x y col1 col2 
1 LIB258 A01 4 3 
2 LIB258 A01 3 2 
3 LIB258 A01 1 1 
4 LIB258 B03 1 3 
5 LIB258 B03 4 1 
6 LIB258 B03 3 4 
7 LIB359 C08 6 5 
8 LIB359 C08 3 1 
9 LIB359 C08 1 4 
+0

Спасибо, это именно то, что мне нужно. Для справки и для всех, кто это нашел, я должен был сказать, что ключи являются строками, поэтому их нужно процитировать, но это легко сделать, если инструкция 'paste' читается' paste («AND a.col3 =», shQuote (rr $ x), sep = '') 'и т. д. – Hassantm

+1

Обратите внимание, что' paste0' - немного более эффективная версия 'paste' с' sep = '' '. –

2

Я не знаю RJDBC, но я использовал RODBC. Вы можете использовать немного paste или paste0 для создания запросов:

query.list <- paste0(" 
    SELECT a.col1, b.col2 FROM tbl1 a, tbl2 b 
    WHERE a.col2 = b.col1 
    AND a.col3 = ",df$x," 
    AND a.col4 = ",df$y) 

Затем используйте lapply, что-то вроде

result.set <- lapply(query.list,dbGetQuery,conn=con) 

Это должно возвращать список фреймов данных. Затем вы можете присоединиться к ним все вместе с

final.df <- do.call(rbind,result.set) 
+0

Это также работает тоже ... Спасибо! – Hassantm

+0

Я также заметил, что, хотя это решение имеет дополнительные шаги, сохраняя 'result.set' отдельно, вы можете проверить его на отсутствие пропущенных значений перед созданием окончательного data.frame! – Hassantm