按Client分组删除名称字段为其他记录名称后缀的记录
解决同一Client下删除被其他记录包含(作为后缀)的记录
我来帮你搞定这个批量删除的需求!你已经找到了被包含的记录,现在只需要把这个逻辑整合到DELETE语句里,限定同一Client的条件就行。
核心思路
我们需要定位到同一Client下,自身Name是另一条同Client记录Name后缀的那些记录,然后批量删除它们。关键是用自关联(同表连接)来匹配这些满足条件的记录。
方法1:使用EXISTS子查询(推荐,逻辑清晰)
先可以用SELECT语句验证要删除的记录是否正确:
SELECT m1.* FROM Main m1 WHERE EXISTS ( SELECT 1 FROM Main m2 WHERE m1.Client = m2.Client -- 限定同一Client AND m1.Name != m2.Name -- 排除记录自身匹配 AND m2.Name LIKE CONCAT('%', m1.Name) -- m1的Name是m2的后缀 )
确认结果符合预期后,把SELECT换成DELETE就能执行删除:
DELETE m1 FROM Main m1 WHERE EXISTS ( SELECT 1 FROM Main m2 WHERE m1.Client = m2.Client AND m1.Name != m2.Name AND m2.Name LIKE CONCAT('%', m1.Name) )
方法2:使用JOIN关联表
如果你习惯用JOIN的写法,也可以这样实现:
先验证:
SELECT DISTINCT m1.* FROM Main m1 JOIN Main m2 ON m1.Client = m2.Client AND m1.Name != m2.Name AND m2.Name LIKE CONCAT('%', m1.Name)
删除语句:
DELETE m1 FROM Main m1 JOIN Main m2 ON m1.Client = m2.Client AND m1.Name != m2.Name AND m2.Name LIKE CONCAT('%', m1.Name)
注意事项
- 一定要先运行SELECT版本确认要删除的记录,避免误删数据!
- 如果你的数据库对CONCAT函数的语法有差异(比如某些版本用
||拼接),可以调整成对应数据库的字符串拼接方式。 - 如果有重复的Name+Client组合,
DISTINCT能帮你避免重复匹配。
内容的提问来源于stack exchange,提问作者user3649739
相关产品推荐
相关产品推荐

