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 子句里,精准筛选要删除的记录
相关推荐
期待のcode2 小时前
MyBatisX插件
java·数据库·后端·mybatis·springboot
小萌新上大分4 小时前
mysql主从复制搭建
mysql·mysql主从复制·mysql主从复制配置·mysql主从复制的搭建·mysql主从复制的原理·mysql安装入门
安审若无4 小时前
oracel迁移数据文件至其他目录操作步骤
数据库
sunxunyong5 小时前
doris运维命令
java·运维·数据库
华仔啊5 小时前
这 10 个 MySQL 高级用法,让你的代码又快又好看
后端·mysql
小鸡吃米…5 小时前
Python PyQt6教程七-控件
数据库·python
忍冬行者5 小时前
清理三主三从redis集群的过期key和键值超过10M的key
数据库·redis·缓存
TimberWill6 小时前
使用Redis队列优化内存队列
数据库·redis·缓存
Knight_AL7 小时前
MySQL 中 UPDATE 语句的执行过程全解析
数据库·mysql
Li.CQ7 小时前
SQL学习笔记(二)
笔记·sql·学习