SQL GROUP BY...HAVING问题:筛选地址重复且ID与地址不匹配的数据
嘿,我来帮你搞定这个SQL查询问题,咱们一步步拆解需求来~
解决方案
你的需求核心是要找出两类特征叠加的记录:一是id不符合「id-+小写address」的规则,二是这条记录的address在表里至少出现过两次。咱们可以分两步实现这个筛选:
具体SQL写法
这里给你两种常用的实现方式,你可以根据自己用的数据库(比如MySQL、PostgreSQL这类)和数据量来选:
方法一:子查询直接统计(写法简单,适合小数据量)
SELECT t.id, t.address FROM your_table_name t WHERE -- 检查id是否和address的规则不匹配 t.id != CONCAT('id-', LOWER(t.address)) -- 确保当前address在表中出现至少两次 AND (SELECT COUNT(*) FROM your_table_name WHERE address = t.address) >= 2;
方法二:JOIN+分组统计(性能更优,适合大数据表)
如果你的表数据量比较大,子查询可能会慢,用分组统计再关联的方式效率更高:
SELECT t.id, t.address FROM your_table_name t -- 先关联到那些出现次数≥2的address集合 JOIN ( SELECT address FROM your_table_name GROUP BY address HAVING COUNT(*) >= 2 ) AS addr_counts ON t.address = addr_counts.address -- 再筛选出id不符合规则的记录 WHERE t.id != CONCAT('id-', LOWER(t.address));
对应你例子的验证
拿你给出的示例数据来说:
| id | address |
|---|---|
| id-abcde | aBcDe |
| id-zxwy | aBcDe |
上面的查询会精准返回第二条记录(id=id-zxwy,address=aBcDe):
- 它的
id不等于id-LOWER(aBcDe)(也就是id-abcde),满足「id与address不匹配」的条件; address=aBcDe在表中出现了2次,满足「至少两条记录」的要求。
额外补充(可选)
如果你的数据库字符串比较是区分大小写的(比如PostgreSQL默认区分),而你希望把aBcDe和ABCDE这类大小写不同的address视为同一个来统计次数,可以稍微调整查询:
SELECT t.id, t.address FROM your_table_name t JOIN ( SELECT LOWER(address) AS normalized_addr FROM your_table_name GROUP BY normalized_addr HAVING COUNT(*) >= 2 ) AS addr_counts ON LOWER(t.address) = addr_counts.normalized_addr WHERE t.id != CONCAT('id-', LOWER(t.address));
这样就能把大小写不同但内容一致的address归为同一组统计啦。
内容的提问来源于stack exchange,提问作者LivingRobot
相关产品推荐
相关产品推荐

