sqldf删除观察到的故障

时间:2015-10-20 07:34:11

标签: sql r sqldf

我正在使用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仍然存在。不知道我做错了什么......我需要所有三个观察结果......任何帮助都非常感谢人们。

1 个答案:

答案 0 :(得分:2)

假设你有这个数据框:

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