【问题标题】:sqldf deleting observations glitchsqldf 删除观察故障
【发布时间】:2015-10-20 19:27:24
【问题描述】:

我正在使用 sqldf 删除如下三个观察结果。

del_query <- sprintf("DELETE from data_table
                      where ID_NUMBER IN (%s)",
                     paste((
                                      '8254700',
                                      '8641472',
                                      '9022163'
                                      ), collapse=", "))

sqlQuery(myconn, del_query)

执行查询时没有看到任何错误。我也没有得到正确的结果。它只是删除了 ID 为 8254700 的第一个观测值,其余两个 ID 为 8641472 或 9022163 的观测值仍然存在。想知道我做错了什么......我需要所有三个观察结果......任何帮助都是非常感谢的人。

【问题讨论】:

    标签: sql r sqldf


    【解决方案1】:

    假设你有这个数据框:

    df <- data.frame(ID = c(8254700, 8641472, 9022163, 1111111, 2222222 ), 
                     field1 = c(1, 2, 3, 4, 5))
    

    给予:

    > df
           ID field1
    1 8254700      1
    2 8641472      2
    3 9022163      3
    4 1111111      4
    5 2222222      5
    

    要删除这三条记录,需要加上"SELECT * FROM df",否则会返回NULL,因为sqldf总是返回给定SQL语句的结果,而DELETE不返回结果。

    library(sqldf)
    sqldf(c("DELETE FROM df WHERE ID IN (8254700, 8641472, 9022163)", "SELECT * FROM df"))
    

    输出:

           ID field1
    1 1111111      4
    2 2222222      5
    

    如果 ID 在单独的向量中,ids,那么试试这个(输出相同):

    ids <- c(8254700, 8641472, 9022163)
    fn$sqldf(c("DELETE FROM df WHERE ID IN (`toString(ids)`)", "SELECT * FROM df"))
    

    或检查中间结果:

    idString <- toString(ids)
    idString
    ## [1] "8254700, 8641472, 9022163"
    
    sql <- fn$identity(c("DELETE FROM df WHERE ID in ($idString)", "SELECT * FROM df"))
    sql
    ## [1] "DELETE FROM df WHERE ID in (8254700, 8641472, 9022163)"
    ## [2] "SELECT * FROM df"   
    
    sqldf(sql)
    ##            ID field1
    ## 1 1111111      4
    ## 2 2222222      5
    

    【讨论】:

    • 我认为 OP 想要这个位作为动态字符串 - (8254700, 8641472, 9022163)
    • @G。 Grothendieck 非常感谢您对答案的彻底编辑和重大贡献。我想这真的是你的答案。
    • @G。 Grothendieck,mpalanco 你们杀了它,太棒了。 :)
    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多