SQL Server:同一卡号存在指定注释时删除对应行
解决方案:删除同时存在'corrected'和'closed'的卡号对应的'corrected'行
原语句的问题
你写的SELECT语句有两个核心逻辑错误:
- 子查询没和主表关联
CARDNUMBER,导致只要表中存在任意一行注释是CORRECTED或CLOSED,主表所有行都会被选中,完全没匹配「同一个卡号同时有两种状态」的需求 - 需求是删除记录,但你写的是查询语句,方向不对
先验证要删除的记录
先执行下面的查询,确认哪些行是需要删除的(避免误删):
SELECT * FROM TABLE1 t1 WHERE t1.COMMENT = 'CORRECTED' AND EXISTS ( SELECT 1 FROM TABLE1 t2 WHERE t2.CARDNUMBER = t1.CARDNUMBER AND t2.COMMENT = 'CLOSED' )
这个语句会精准筛选出:注释为CORRECTED,且同一个卡号下存在注释为CLOSED的行。
执行删除操作
确认数据无误后,执行删除语句:
DELETE t1 FROM TABLE1 t1 WHERE t1.COMMENT = 'CORRECTED' AND EXISTS ( SELECT 1 FROM TABLE1 t2 WHERE t2.CARDNUMBER = t1.CARDNUMBER AND t2.COMMENT = 'CLOSED' )
- 用
t1、t2做表别名,区分主表和子查询的表,确保关联的是同一个卡号 - 子查询里用
SELECT 1比选具体字段更高效,不影响逻辑判断
补充说明
如果数据库对大小写敏感,或者注释存在大小写混合的情况,可以把条件改成LOWER(t1.COMMENT) = 'corrected'和LOWER(t2.COMMENT) = 'closed'来匹配。
内容的提问来源于stack exchange,提问作者RebeccaJohnson
相关产品推荐
相关产品推荐

