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 子句里,精准筛选要删除的记录
相关推荐
一腔热血100718 分钟前
prometheus alertmanager 对接飞书
数据库·飞书·prometheus
魔芋红茶1 小时前
MySQL 从入门到精通 16:主从复制
android·mysql·adb
babytiger2 小时前
如何将yolo训练图像数据库的某个分类的图像取出来
数据库·yolo·分类
九皇叔叔5 小时前
【7】SQL 语句基础应用
数据库·sql·mysql
小云数据库服务专线7 小时前
GaussDB 数据库架构师修炼(十八) SQL执行引擎-概述
sql·数据库架构·gaussdb
麦聪聊数据7 小时前
能源行业数据库远程运维安全合规实践:Web化平台的落地经验
运维·数据库·sql·安全·数据服务
喔烨鸭8 小时前
前后端分离情况下,将本地vue项目和Laravel项目以及mysql放到自己的云服务器
vue.js·mysql·laravel
chenglin0168 小时前
阿里云——云存储与数据库服务
数据库·阿里云·云计算
NPE~8 小时前
[手写系列]Go手写db — — 第二版
开发语言·数据库·golang·教程·db·手写系列
开开心心就好11 小时前
PDF转长图工具,一键多页转图片
java·服务器·前端·数据库·人工智能·pdf·推荐算法