【问题标题】:SQLDF Update ignoring the UpdateSQLDF 更新忽略更新
【发布时间】:2021-09-04 13:05:54
【问题描述】:

我遇到了一个问题,我正在调用 sqldf 对添加的行进行更新。我已经阅读了 sqldf 文档并遵循了他们的示例,并且没有出现超出正常“必须使用 dbExecute()”的警告。但是,无论我如何更改语句,即使对于非常简单的事情,它都会忽略更新。

```{r}
df$DiscPric = 0
head(df,5)

sqldf(c("UPDATE df SET DiscPric = Total*0.9 Where NumOfItems >= 5"))
sqldf(c("UPDATE df SET DiscPric = Total Where NumOfItems < 5"))
```;

以下是更改前创建的数据框、添加的新列和更新。我不知道语法是否错误,但它没有标记它。当我尝试切换到更简单的更新,例如“UPDATE df SET Total = 0 Where InvoiceId = 1”时,它也会忽略这个简单的更新

.com/7wy3q.png

【问题讨论】:

    标签: r sqldf


    【解决方案1】:

    sqldf 不会更新 R 中的变量,它只是将数据导入 sqlite 然后处理。如果您希望更新替换 R 版本的df,您需要运行两个查询并覆盖df

    类似:

    df$DiscPric = 0
    head(df,5)
    
    DF <- sqldf(c("UPDATE df SET DiscPric = Total*0.9 Where NumOfItems >= 5",
                  "SELECT * from main.df"))
    DF <- sqldf(c("UPDATE df SET DiscPric = Total Where NumOfItems < 5",
                  "SELECT * from main.df"))
    

    或者更简洁:

    df$DiscPric = 0
    head(df,5)
    
    DF <- sqldf(c("UPDATE df SET DiscPric = Total*0.9 Where NumOfItems >= 5",
                  "UPDATE main.df SET DiscPric = Total Where NumOfItems < 5",
                  "SELECT * from main.df"))
    

    或者使用case when ... then ... end(一个SQL函数):

    df$DiscPric = 0
    head(df,5)
    
    DF <- sqldf(c("UPDATE df SET DiscPric = Total * (case when NumOfItems >= 5 then 0.9 else 1 end)",
                  "SELECT * from main.df"))
    
    

    更多解释请参见https://github.com/ggrothendieck/sqldf#8-why-am-I-having-problems-with-update(向下滚动到第 8 个标题,该链接并不总是将您带到 github 中)。

    请注意,main. 在第二个(和后续)查询中是必需的(并且不能在第一个查询中)。没有它,第二个查询中的sqldf 将再次从 R 环境中提取df,忽略第一个查询中的更新。 main. 是 sqlite 的数据库名称,所以它告诉 sqlite/sqldf 在其架构中使用已经存在的表。


    不过,在紧要关头,您可以直接在 R 中执行此操作而无需 sqldf,以防这不是一个简化的示例:

    x$DiscPric <- x$Total * ifelse(x$NumOfItems >= 5, 0.9, 1)
    

    【讨论】:

    • 谢谢,就是这样。 then 和 end 的第三个例子效果最好!虽然奇怪的是,第一个显示示例分成两部分的示例实际上并没有为我工作,我收到错误“x 不在表格中”
    • 很高兴第三个成功了,不确定第一个错误...刚刚用main.df 错过了参考更新了第二个。
    猜你喜欢
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 1970-01-01
    相关资源
    最近更新 更多