我正在尝试执行查询或表单:
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
魔法来构建单个查询,但是如何运行它们并将结果返回到数据框?
由于 哈桑
答案 0 :(得分: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)
答案 1 :(得分: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