在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
相关产品推荐
相关产品推荐

