PostgreSQL:如何查找列中重复记录并显示对应主键ID?
查询重复记录并显示主键ID的方法
嘿,这个需求挺常见的,我来给你几种实用的SQL解决方法,你可以根据自己用的数据库和实际场景选:
方法一:分组子查询关联原表(通用所有SQL数据库)
这是最通用的写法,不管你用MySQL、PostgreSQL还是SQL Server都能跑通。假设你的表叫Name,用来判断重复的字段是重复字段名(比如username或者email),主键是id,可以这么写:
SELECT n.id, n.重复字段名 FROM Name n JOIN ( -- 先找出所有出现次数超过1次的重复字段值 SELECT 重复字段名 FROM Name GROUP BY 重复字段名 HAVING COUNT(*) > 1 ) AS 重复分组 ON n.重复字段名 = 重复分组.重复字段名 ORDER BY n.重复字段名, n.id;
如果是多个字段组合起来才算重复(比如姓名+手机号同时相同才算重复),只需要调整子查询的分组字段就行:
SELECT n.id, n.字段1, n.字段2 FROM Name n JOIN ( SELECT 字段1, 字段2 FROM Name GROUP BY 字段1, 字段2 HAVING COUNT(*) > 1 ) AS 重复分组 ON n.字段1 = 重复分组.字段1 AND n.字段2 = 重复分组.字段2 ORDER BY n.字段1, n.字段2, n.id;
方法二:窗口函数(适合支持窗口函数的数据库,如MySQL 8+、PostgreSQL、SQL Server)
如果你的数据库支持窗口函数,这种写法更简洁直观,不需要额外的JOIN操作:
SELECT id, 重复字段名 FROM ( SELECT id, 重复字段名, -- 按重复字段分组,计算每个组的记录数 COUNT(*) OVER (PARTITION BY 重复字段名) AS 重复次数 FROM Name ) AS 带次数统计的表 WHERE 重复次数 > 1 ORDER BY 重复字段名, id;
小提示
记得把上面SQL里的重复字段名、字段1、字段2替换成你表中实际用来判断重复的字段,id替换成你的主键字段名哦~
内容的提问来源于stack exchange,提问作者Sawan Doijode
相关产品推荐
相关产品推荐

