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 子句里,精准筛选要删除的记录
相关推荐
DBA小马哥2 小时前
时序数据库迁移替换与时序数据库分片
数据库·时序数据库
DBA小马哥2 小时前
时序数据库迁移方案在物联网设备监测中的实践与性能突破
数据库·物联网·时序数据库
ID_180079054732 小时前
小红书笔记详情API接口基础解析:数据结构与调用方式
数据结构·数据库·笔记
ruleslol8 小时前
MySQL的段、区、页、行 详解
数据库·mysql
天若有情6738 小时前
校园二手交易系统实战开发全记录(vue+SpringBoot+MySQL)
vue.js·spring boot·mysql
Learn-Python8 小时前
MongoDB-only方法
python·sql
while(1){yan}8 小时前
MyBatis Generator
数据库·spring boot·java-ee·mybatis
それども8 小时前
MySQL affectedRows 计算逻辑
数据库·mysql
是小章啊8 小时前
MySQL 之SQL 执行规则及索引详解
数据库·sql·mysql
富士康质检员张全蛋9 小时前
JDBC 连接池
数据库