MySQL中如何用JOIN改写DELETE语句?解决#1093报错问题
用JOIN改写重复卡片删除语句解决MySQL 1093错误
你遇到的是MySQL的典型限制:不能在DELETE/UPDATE语句的WHERE子句中直接将目标表作为子查询的FROM表引用。下面是用JOIN实现相同逻辑的写法,核心是先通过子查询生成要保留的记录集合,再关联原表定位需要删除的数据。
简洁高效的写法
DELETE cc FROM customers_cards cc LEFT JOIN ( -- 先筛选出ezpay下每个卡号对应的最小ID(要保留的记录) SELECT number_card, MIN(id) AS min_id FROM customers_cards WHERE belongs_to = "ezpay" GROUP BY number_card ) AS keep_rows ON cc.id = keep_rows.min_id -- 只删除ezpay分组中,不在保留列表里的记录 WHERE cc.belongs_to = "ezpay" AND keep_rows.min_id IS NULL;
逻辑说明
- 子查询
keep_rows先过滤出ezpay分组下,每个number_card对应的最小ID,这些是需要保留的唯一记录 - 原表
cc与这个保留集合做左连接,找不到匹配(keep_rows.min_id IS NULL)的记录就是需要删除的重复项 - 通过临时子查询结果集关联,避开了MySQL对直接引用目标表的限制
内容的提问来源于stack exchange,提问作者Martin AJ
相关产品推荐
相关产品推荐

