【问题标题】:RJDBC Query from lists of index values从索引值列表中查询 RJDBC
【发布时间】:2012-11-26 16:02:03
【问题描述】:

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

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 魔法来构建单个查询,但是我如何运行它们并将结果返回到数据帧?

谢谢 哈桑

【问题讨论】:

    标签: r vector rjdbc


    【解决方案1】:

    使用 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
    

    【讨论】:

    • 谢谢,这正是我所追求的。作为参考和其他任何发现此内容的人,我应该说键是字符串,因此需要引用,但这很容易通过将paste 语句读取为paste("AND a.col3 = ", shQuote(rr$x), sep='') 等来完成。
    • 请注意,paste0pastesep = '' 的更高效版本。
    【解决方案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)
    

    这应该返回一个数据框列表。然后你可以将它们全部重新加入

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

    【讨论】:

    • 我还注意到,虽然这个解决方案有额外的步骤,但通过将result.set 分开,您可以在创建最终 data.frame 之前检查它是否有任何缺失值!
    猜你喜欢
    • 2019-07-30
    • 2015-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-12
    相关资源
    最近更新 更多