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 子句里,精准筛选要删除的记录
相关推荐
云和恩墨1 小时前
国网某省电力借zDBM重构数据库容灾防线,400TB核心资产迈入分布式实时保护时代
数据库·分布式·重构
大千AI助手1 小时前
ER图:数据库设计的可视化语言 - 搞懂数据关系的基石
数据库
李强57627822 小时前
语法制导的语义计算(包含python源码)
java·数据库·python
企销客CRM2 小时前
企微CRM系统中的任务分配与效率提升技巧
大数据·数据库·人工智能·数据分析·企业微信
Hello.Reader2 小时前
Redis 延迟排查全攻略
数据库·redis·缓存
jstart千语2 小时前
【Redisson】锁的可重试原理和看门狗机制
数据库·redis·缓存
AA-代码批发V哥3 小时前
MySQL-多表查询深度解析与实战指南
mysql
Lx3524 小时前
EXPLAIN工具:查询执行计划分析与索引诊断
sql·mysql·性能优化
架构个驾驾4 小时前
Express 框架深度解析:从基础到实战的完整指南
javascript·mysql
听忆.4 小时前
Java修改接口 校验一个或多个字段不可重复(自定义注解)
java·开发语言·数据库