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 子句里,精准筛选要删除的记录
相关推荐
末央&几秒前
【天机论坛】项目环境搭建和数据库设计
java·数据库
徒 花4 分钟前
数据库知识复习07
数据库·作业
素玥19 分钟前
实训5 python连接mysql数据库
数据库·python·mysql
jnrjian26 分钟前
text index 查看index column index定义 index 刷新频率 index视图
数据库·oracle
瀚高PG实验室44 分钟前
审计策略修改
网络·数据库·瀚高数据库
言慢行善1 小时前
sqlserver模糊查询问题
java·数据库·sqlserver
韶博雅1 小时前
emcc24ai
开发语言·数据库·python
有想法的py工程师1 小时前
PostgreSQL 分区表排序优化:Append Sort 优化为 Merge Append
大数据·数据库·postgresql
喵了几个咪2 小时前
如何在 Superset Docker 容器中安装 MySQL 驱动
mysql·docker·容器·superset
迷枫7122 小时前
达梦数据库的体系架构
数据库·oracle·架构