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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:01:40