You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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));

对应你例子的验证

拿你给出的示例数据来说:

idaddress
id-abcdeaBcDe
id-zxwyaBcDe

上面的查询会精准返回第二条记录(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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:25:55