如何在SQL Server中查询特定列值重复的行?
解决SQL Server中筛选列值重复出现行的问题
你的Data表数据如下:
| ColA | ColB | ColC |
|---|---|---|
| John | Smith | 1234 |
| David | Smith | 3456 |
| Scott | Clark | 198 |
| Brian | Williams | 155 |
| Jeremy | Williams | 765 |
要返回ColB列值出现多次的行,有两种常用方法,都用到了你猜测的COUNT函数:
方法一:子查询 + GROUP BY
先通过子查询找出ColB中出现次数≥2的取值,再关联原表获取完整行数据:
SELECT d.* FROM Data d INNER JOIN ( SELECT ColB FROM Data GROUP BY ColB HAVING COUNT(*) >= 2 ) dup ON d.ColB = dup.ColB;
逻辑说明:
- 子查询里通过
GROUP BY ColB分组,用HAVING COUNT(*) >=2筛选出重复的ColB值; - 用
INNER JOIN关联原表,只保留这些重复ColB对应的行。
方法二:窗口函数(SQL Server 2008及以上支持)
用COUNT() OVER(PARTITION BY ColB)窗口函数直接计算每行对应的ColB出现次数,再筛选次数≥2的行:
SELECT ColA, ColB, ColC FROM ( SELECT ColA, ColB, ColC, COUNT(*) OVER(PARTITION BY ColB) AS ColBCount FROM Data ) t WHERE ColBCount >= 2;
逻辑说明:
- 内层查询给每行添加一个
ColBCount字段,值为当前行ColB在表中的总出现次数; - 外层查询筛选出
ColBCount≥2的行,也就是ColB重复的行。
这两种方法都能得到你需要的结果,窗口函数的写法不需要额外关联,在数据量较大时性能表现也不错。
内容的提问来源于stack exchange,提问作者Avery1
相关产品推荐
相关产品推荐

