求删除表中作为长文本子集的短文本条目的正确SQL语句
解决方法
你的SQL问题出在LIKE条件的写法上——'%T1.Column1%'会把T1.Column1当成普通字符串处理,而不是引用T1表的Column1字段值。另外还要注意排除记录自身,否则每条记录都会匹配到自己,导致误删所有数据。
修正后的SQL语句如下:
DELETE FROM mytable T1 WHERE EXISTS ( SELECT 1 FROM mytable T2 WHERE T2.Column1 LIKE CONCAT('%', T1.Column1, '%') AND T2.id != T1.id -- 排除自身,避免匹配到同一条记录 AND LENGTH(T2.Column1) > LENGTH(T1.Column1) -- 确保T2是更长的文本,避免互相匹配 )
关键说明:
- 使用
CONCAT('%', T1.Column1, '%')来拼接通配符和字段值,让数据库正确识别T1.Column1是字段引用。 - 添加
T2.id != T1.id防止记录匹配到自身,避免误删所有数据。 - 增加
LENGTH(T2.Column1) > LENGTH(T1.Column1)确保只有更长的文本包含短文本时才触发删除,避免出现双向匹配的极端场景。
如果你的数据库不支持CONCAT函数(比如部分老版本MySQL),可以用字符串拼接符替代:
-- MySQL老版本兼容写法 DELETE FROM mytable T1 WHERE EXISTS ( SELECT 1 FROM mytable T2 WHERE T2.Column1 LIKE '%' || T1.Column1 || '%' AND T2.id != T1.id AND LENGTH(T2.Column1) > LENGTH(T1.Column1) )
内容的提问来源于stack exchange,提问作者Cymro
相关产品推荐
相关产品推荐

