【问题标题】:SQL delete query not executing using sqldf in RSQL删除查询未在R中使用sqldf执行
【发布时间】:2023-01-10 22:56:35
【问题描述】:

我有一个表 - “cla_retail” - 在 sql 中有 20,000 多行。我已经使用 dbConnect 读取了 R 中的表并将其存储在名为“cla_retail_df”的数据框中 我正在尝试在数据帧 abc 上使用 sqldf 执行 DELETE 查询。当我在 mySQL 中执行时,此删除查询工作正常,但在 R 中执行时返回 0 个结果。

我也尝试过使用 dplyr 但我对 sql 查询中的许多“不”感到困惑。 我已经初始化了其他数据框

  1. sales_vou_main_appr,
  2. issue_to_karigar_approval_main ,
  3. issue_to_hallmark_main ,
  4. sample_issue_to_karigar_main

    这是我在 R 中尝试过并在 abc_v2 中抛出 0 行的内容:

    abc <- cla_retail_df
    
    abc_v2<- sqldf("delete from abc where status<>'N' and barcode not in(select barcode from sales_vou_main_appr where ret_status='0') and barcode not in(select barcode from issue_to_karigar_approval_main where ret_status='0') and barcode not in(select barcode from issue_to_hallmark_main where rec_status='0') and barcode not in(select barcode from sample_issue_to_karigar_main where rec_status='0')")
    

【问题讨论】:

  • 这主要是 stackoverflow.com/q/61373594/3358272 的骗局(因此 sqldf FAQ 8 是相关的),尽管您使用的是 DELETE 而不是 UPDATE。前提是(我相信)相同:sqldf 不会就地删除,而且它永远不会自动返回。如果您希望 abc_vw 成为不带行的 cla_retail_df 的内容,则 abc_v2 &lt;- sqldf(c("delete from abc where ...", "select * from abc"))

标签: mysql r dplyr sql-delete sqldf


【解决方案1】:

在 dplyr 中试试这个:

lapply(list(sales_vou_main_appr, issue_to_karigar_approval_main,
            issue_to_hallmark_main, sample_issue_to_karigar_main),
       function(Z) filter(Z, ret_status == "0") %>% select(barcode)) %>%
  bind_rows() %>%
  anti_join(cla_retail_df, by = "barcode") %>%
  filter(status != "N")

至于在sqldf中使用DELETE,意识到sqldf出于安全原因默认不返回数据(在更新/删除时)(参见sqldfFAQ 8,滚动到问题8),你有通过第二个查询明确请求它。尝试:

abc_v2 <- sqldf(c("delete from abc where ...",
                  "select * from abc"))

意识到 "delete from abc where ..." 不会从 data.frame 对象 abc 中删除任何内容,它会从它默认使用的内存 SQLite 数据库中名为 abc 的(临时?)表中删除它(假设您正在使用sqldf 的 SQLite 引擎)。

【讨论】:

    猜你喜欢
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 1970-01-01
    • 2019-07-16
    • 2013-05-03
    相关资源
    最近更新 更多