如何从同一张表中查询ID与valC字段均匹配的重复行
SQL筛选指定字段组合重复行的实现方案
需求核心
你需要筛选的是**ID和valC两个字段的组合重复出现≥2次**的所有行,忽略valA、valB的取值差异。
推荐实现方案(更适合初学者,逻辑清晰不易错)
用窗口函数实现,分层逻辑便于排查问题:
SELECT ID, valA, valB, valC FROM ( SELECT *, -- 按ID和valC分组,统计每组的行数 COUNT(*) OVER (PARTITION BY ID, valC) AS group_row_count FROM 你的表名 ) tmp -- 过滤出行数≥2的组,也就是存在重复的组的所有行 WHERE group_row_count >= 2;
运行上述代码会直接返回你预期的ID=2、valC=LA的两条重复行。
COUNT+INNER JOIN的正确写法
你之前用这个方法没得到预期结果,大概率是分组时错误加入了valA/valB字段,正确写法如下:
SELECT t1.* FROM 你的表名 t1 INNER JOIN ( -- 先找出所有重复的(ID, valC)组合 SELECT ID, valC FROM 你的表名 GROUP BY ID, valC HAVING COUNT(*) >= 2 ) t2 ON t1.ID = t2.ID AND t1.valC = t2.valC;
初学者技巧建议
- 处理重复行需求时,第一步先明确判断重复的字段组合,所有分组、关联的逻辑都要严格对齐这个组合,不要多增/遗漏字段
- 优先用窗口函数处理这类行级过滤需求,排查问题时可以先单独运行内层子查询,确认分组计数的结果是否符合预期,再做外层过滤
- 用
GROUP BY分组时,只需要把判断重复的字段加入分组规则,其他不需要判断的字段不要加进去,否则会缩小重复判定的范围,得到错误结果
内容的提问来源于stack exchange,提问作者Yokanishaa
相关产品推荐
相关产品推荐

