使用sqldf从数据表中删除行

3
我想知道是否R不支持使用sqldf从数据表中删除行。我的数据看起来像这样: enter image description here 我正在尝试使用删除语句从数据表中删除记录。没有底层数据库,只有一个data.table。但是当我输入以下SQL语句时:
loans_good <- sqldf("Delete from LoansDT1 where status not in ('Current','Default')")

我收到了以下错误信息:
'SQL statements must be issued with dbExecute() or dbSendStatement() instead of dbGetQuery() or dbSendQuery().' 

由于我一直收到更新的同样信息,所以我想知道这是否是一种限制。


1
你在这里想使用 sqldf 的具体原因是什么?我认为这可以直接使用 R 的标准子集操作完成。 - Ronak Shah
2个回答

2
这个问题是一个FAQ。请参见sqldf github主页上的FAQ 8。
操作确实起作用。这条消息是一条警告消息,而不是错误消息。该消息具有误导性,您可以忽略它。请注意,问题没有显示完整的消息——完整的消息确实说明了它是一条警告消息。
警告消息来自于RSQLite,而不是sqldf本身。它是由于某个时刻引入了不向后兼容的更改所引起的;但是,正如所述,实际操作仍然有效。
此外,deleteupdate作用于数据库中的表。它们不返回值,因此即使它们工作,您也看不到任何结果。如果您想要一个结果,您必须在deleteupdate之后使用select语句来检索修改后的表。
以下是一个使用内置的6行BOD数据框的示例。它删除了最后一行,因为该行的时间大于5。
library(sqldf)

sqldf(c("delete from BOD where Time > 5", "select * from BOD"))
##   Time demand
## 1    1    8.3
## 2    2   10.3
## 3    3   19.0
## 4    4   16.0
## 5    5   15.6
## Warning message:
## In result_fetch(res@ptr, n = n) :
##   SQL statements must be issued with dbExecute() or dbSendStatement() instead of dbGetQuery() or dbSendQuery().

请注意,这在sqldf问题列表中有说明,并提供了一条有关此消息的解决方法:https://github.com/ggrothendieck/sqldf/issues/40

我不明白这与链接页面上的FAQ 8(或任何其他FAQ)有什么关系,尽管我很快地浏览了一遍它们。 - Dave Costa
搜索页面中的“为什么我在更新时遇到问题?”以查找常见问题解答8。 - G. Grothendieck
常见问题解答似乎与您的回答的次要部分有关,即如何实际查看更新或删除的结果。我认为既然您在回答中以对常见问题解答的引用开始,那么它应该与 RSQLite 的警告有关。 - Dave Costa
关键问题不在于看不到结果或消息,而在于问题中的代码没有任何效果,因为没有添加“select”,所以没有返回任何内容。 - G. Grothendieck

0
你需要使用dbExecute()来执行删除、更新或插入查询。
conn <- dbConnect("Put your connection to your database here")

dbExecute(
  conn,
  "Delete from LoansDT1 where status not in ('Current','Default')"
)

dbReadTable(conn, LoansDT1) # Check

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接