You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在R中使用sqldf执行DELETE查询无结果,MySQL中可正常运行

解决R中sqldf执行DELETE返回0行的问题

问题核心

sqldf在R中的DELETE行为和MySQL存在差异:它不会直接修改原数据框,而是返回被删除的记录。你得到0行结果,要么是没有符合删除条件的记录,要么是子查询的数据引用逻辑存在问题。

可行解决方案

方案1:调整sqldf语句,改用SELECT获取目标数据

既然你实际需要的是过滤后的数据,而非删除操作,直接用SELECT更适配sqldf的使用逻辑:

abc <- cla_retail_df

abc_v2 <- sqldf("
  SELECT * 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')
")

方案2:用dplyr分步实现多条件过滤

针对多个“not”逻辑的困惑,dplyr的anti_join可以清晰实现排除操作:

library(dplyr)

# 先过滤status不等于'N'的行
abc_v2 <- cla_retail_df %>% filter(status != 'N')

# 依次排除四个数据框中符合条件的barcode
abc_v2 <- abc_v2 %>% 
  anti_join(sales_vou_main_appr %>% filter(ret_status == '0'), by = "barcode") %>%
  anti_join(issue_to_karigar_approval_main %>% filter(ret_status == '0'), by = "barcode") %>%
  anti_join(issue_to_hallmark_main %>% filter(rec_status == '0'), by = "barcode") %>%
  anti_join(sample_issue_to_karigar_main %>% filter(rec_status == '0'), by = "barcode")

排查验证要点

  • 检查四个数据框中符合条件的记录数:比如执行nrow(filter(sales_vou_main_appr, ret_status == '0')),确认子查询是否有数据
  • 验证基础数据的过滤结果:执行nrow(filter(cla_retail_df, status != 'N')),确认初始过滤的行数量是否符合预期
  • 确认所有数据框在当前R环境中存在,且名称拼写完全正确

内容的提问来源于stack exchange,提问作者Shryans Baid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 12:20:40