MySQL:要删除子查询所涉及表中的数据,直接使用原 SQL 会报错

sql 复制代码
delete from  pms_pay_refund_order where pay_order_no in (select pay_order_no from pms_pay_refund_order GROUP BY pay_order_no HAVING count(pay_order_no) >1) and  channel_err_msg = '申请退款金额大于可退款余额'

在 MySQL 里,若要删除子查询所涉及表中的数据,直接使用原 SQL 会报错

1093 - You can't specify target table 'pms_pay_refund_order' for update in FROM clause

下面是修正后的 SQL 语句:

sql 复制代码
DELETE p1 
FROM pms_pay_refund_order p1
JOIN (
    SELECT pay_order_no 
    FROM pms_pay_refund_order 
    GROUP BY pay_order_no 
    HAVING COUNT(pay_order_no) > 1
) p2 ON p1.pay_order_no = p2.pay_order_no
WHERE p1.channel_err_msg = '申请退款金额大于可退款余额';

主要修改点

  1. 运用内连接(JOIN)把主表和子查询结果关联起来,防止出现 "你不能在 FROM 子句中为更新指定目标表" 的错误。
  2. 采用表别名(p1、p2)清晰区分主表和子查询。
  3. 把过滤条件 channel_err_msg = ... 放在 WHERE 子句里,精准筛选要删除的记录
相关推荐
an__ya__几秒前
MySQL事务
mysql
x***13396 分钟前
SQL Server 创建用户并授权
数据库·oracle
JIngJaneIL11 分钟前
智慧物业|物业管理|基于SprinBoot+vue的智慧物业管理系统(源码+数据库+文档)
java·前端·数据库·vue.js·spring boot·论文·智慧物业管理系统
枫叶梨花30 分钟前
一次 Kettle 中文乱码写入失败的完整排查实录
数据库·后端
笃行客从不躺平1 小时前
遇到大SQL怎么处理
java·开发语言·数据库·sql
逻极2 小时前
Redis Queue (RQ) 核心原理:轻量任务队列的设计与实践(一句话讲透核心本质)
数据库·redis·bootstrap
q***31832 小时前
Window下Redis的安装和部署详细图文教程(Redis的安装和可视化工具的使用)
数据库·redis·缓存
大锦终3 小时前
【MySQL】基本查询
数据库·mysql
last_zhiyin3 小时前
Oracle sql tuning guide 翻译 Part 6-5 --- Hint使用报告的操作方法和例子
数据库·sql·oracle·sql tunning
Rysxt_3 小时前
Spring Boot SPI 教程
java·数据库·sql