2

我正在尝试执行查询或表单:

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 中是否有一种优雅的方法可以做到这一点?我知道我可以使用一些paste魔法来构建单个查询,但是如何运行它们并将结果返回到数据框?

谢谢哈桑

4

2 回答 2

2

我不知道 RJDBC,但我使用过 RODBC。您可以使用一点pasteorpaste0来创建查询:

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)
于 2012-11-26T17:23:12.077 回答
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
于 2012-11-26T17:51:09.737 回答