如何对含ID、PARTYID、PARTYTYPE的表按规则处理PARTYTYPE为'A'的记录
SQL实现PARTYTYPE字段规则更新/删除方案
假设你的表名为party_table,优先执行删除操作再执行更新操作,避免更新生成的B记录干扰删除条件判断。
1. 执行删除操作(处理同时存在A、B的PARTYID)
删除逻辑:找到所有同时拥有PARTYTYPE为A和B的PARTYID,删除这些PARTYID下所有PARTYTYPE为A的记录。
通用SQL写法:
DELETE FROM party_table WHERE PARTYTYPE = 'A' AND PARTYID IN ( SELECT PARTYID FROM party_table WHERE PARTYTYPE IN ('A', 'B') GROUP BY PARTYID HAVING COUNT(DISTINCT PARTYTYPE) = 2 );
如果使用MySQL数据库,不能直接在子查询中引用操作表,改用关联删除写法:
DELETE t1 FROM party_table t1 INNER JOIN ( SELECT PARTYID FROM party_table WHERE PARTYTYPE IN ('A', 'B') GROUP BY PARTYID HAVING COUNT(DISTINCT PARTYTYPE) = 2 ) t2 ON t1.PARTYID = t2.PARTYID WHERE t1.PARTYTYPE = 'A';
2. 执行更新操作(处理仅存在A的PARTYID)
更新逻辑:找到所有没有PARTYTYPE为B的PARTYID,将这些PARTYID下PARTYTYPE为A的记录更新为B。
UPDATE party_table SET PARTYTYPE = 'B' WHERE PARTYTYPE = 'A' AND PARTYID NOT IN ( SELECT DISTINCT PARTYID FROM party_table WHERE PARTYTYPE = 'B' );
针对指定PARTYID处理的调整
如果只需处理某个特定PARTYID,在上述两个语句的WHERE条件中都添加AND PARTYID = 你的目标PARTYID即可,例如处理PARTYID=3的删除语句调整为:
DELETE FROM party_table WHERE PARTYTYPE = 'A' AND PARTYID = 3 AND PARTYID IN ( SELECT PARTYID FROM party_table WHERE PARTYTYPE IN ('A', 'B') GROUP BY PARTYID HAVING COUNT(DISTINCT PARTYTYPE) = 2 );
效果验证
对应你提供的示例数据,执行上述语句后输出结果和预期完全匹配:
- PARTYID=1:同时存在A、B,删除ID=1的A记录,保留ID=2、3的记录
- PARTYID=2:同时存在A、B,删除ID=4的A记录,保留ID=5的记录
- PARTYID=3:仅存在A,更新为B,ID=6的PARTYTYPE变为B
内容的提问来源于stack exchange,提问作者xiiiiiii
相关产品推荐
相关产品推荐

