SQL表中nvarchar类型字段重复值查找及现有查询无结果问题
原SQL无法返回结果的核心问题
- 分组维度完全错了:你把每行独有的
Name字段也放进了GROUP BY的分组条件里,分组后每一组就是单独的一行,不管怎么统计COUNT,结果最多就是1,根本不可能满足>1的判定。 - 重复判定逻辑和需求错位:
你实际要的筛选规则是「只要某一行里的任意一个非空字段值,在全表其他行出现过相同取值,就保留这行」,但原SQL的HAVING写的是三个字段的计数用AND连接,要求同一行的ID、ID1、ID3三个值同时都有重复才能被选中,和预期规则完全不符。
另外COUNT(字段)本身不会统计空值,哪怕调整分组逻辑,像示例里AB4的ID3是空、AB6的ID1是空,这些空值对应的计数永远是1,根本过不了AND的校验。
可匹配预期结果的实现写法
用「先捞出全表所有列中存在重复的非空值,再匹配回原表保留符合条件的行」的逻辑就能实现,通用SQL语法如下:
SELECT t.Name, t.ID, t.ID1, t.ID3 FROM 你的数据表名 t WHERE -- 只要行内任意一个非空字段值存在跨表重复,就保留该行 (t.ID IS NOT NULL AND t.ID IN (SELECT ID FROM 你的数据表名 WHERE ID IS NOT NULL GROUP BY ID HAVING COUNT(*) >1)) OR (t.ID1 IS NOT NULL AND t.ID1 IN (SELECT ID1 FROM 你的数据表名 WHERE ID1 IS NOT NULL GROUP BY ID1 HAVING COUNT(*) >1)) OR (t.ID3 IS NOT NULL AND t.ID3 IN (SELECT ID3 FROM 你的数据表名 WHERE ID3 IS NOT NULL GROUP BY ID3 HAVING COUNT(*) >1))
按照示例数据执行后,返回的结果和你贴的预期完全一致:
- AB1:ID值
234ACB、ID1值BCD123、ID3值EFD234都存在重复,被保留- AB4:ID值
234ACB、ID1值BCD123存在重复,被保留- AB6:ID3值
EFD234存在重复,被保留- AB7:ID1值
BCD123、ID3值EFD234存在重复,被保留
剩下的AB2、AB3、AB5行,所有非空字段值都是全表唯一的,会被自动过滤掉。
内容的提问来源于stack exchange,提问作者Joe Swift
相关产品推荐
相关产品推荐

