2012-11-26 28 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 

使用RJDBC Oracle數據庫。我有一個數據框與列x和y標識。我無法找到任何有關如何爲我的數據框中的各個值生成和執行查詢的詳細信息。

我的數據幀的格式爲:

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

所以我需要一種方法來生成和順序運行三個不同的查詢,然後將結果收集到的數據幀。

有沒有一個優雅的方式來做到這一點在R?我知道我可以使用一點點神奇來構建單個查詢,但是我該如何運行它們並將結果返回給數據框?

感謝 哈桑

回答

2

加入他們都回來一起粘貼

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。您可以使用一點pastepaste0創建查詢:

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) 

這應返回的數據幀的列表。然後,你可以使用plyr與

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

這也適用過...謝謝! – Hassantm

+0

我也注意到,雖然這個解決方案有額外的步驟,通過保持'result.set'獨立,你可以在創建最終的data.frame之前檢查它是否有缺失值! – Hassantm