Administrator
Published on 2026-04-07 / 0 Visits
0

PostgreSQL 联合字段去重查询(3种常用方法)

#AI

PostgreSQL 联合字段去重查询(3种常用方法)

在 PostgreSQL 中,按照多个字段联合去重(即:几个字段组合起来完全相同才算重复),最常用、最简单的有 3 种方法,直接套用即可:

准备测试表(方便你理解)

假设你有一张 user_info 表,字段:id, name, age, city, phone
需求:按 name + age + city 三个字段联合去重


方法1:DISTINCT ON(PG 专属,最推荐)

PostgreSQL 独有的语法,专门用于多字段去重,性能最好、语法最简洁:

-- 保留每组重复数据的第一条
SELECT DISTINCT ON (name, age, city)  -- 括号内写需要联合去重的字段
    *  -- 可以写需要查询的字段,也可以用 *
FROM user_info
-- 建议搭配 ORDER BY,保证去重后数据稳定
ORDER BY name, age, city, id; 

✅ 优点:PG 原生优化,性能最高,支持自定义保留哪一条数据
✅ 适用:绝大多数联合去重场景


方法2:标准 DISTINCT(通用,所有数据库支持)

把需要去重的字段放在 DISTINCT 后面,只查询去重后的字段

-- 只返回联合去重后的字段
SELECT DISTINCT 
    name, age, city  -- 联合去重的字段
FROM user_info;

如果需要查询所有字段,用 DISTINCT ON 更合适。


方法3:GROUP BY(分组去重,通用语法)

用分组实现去重,和 DISTINCT 效果一致:

SELECT 
    name, age, city  -- 必须和 GROUP BY 字段一致
FROM user_info
GROUP BY name, age, city;  -- 联合去重字段

✅ 优点:兼容 MySQL、Oracle 等所有数据库
✅ 适用:需要跨数据库兼容的场景


完整实战示例

场景:查询用户表,按 姓名+年龄+城市 去重,返回完整数据

-- PG 最优写法
SELECT DISTINCT ON (name, age, city)
    id, name, age, city, phone
FROM user_info
ORDER BY name, age, city, id DESC; -- 按id倒序,保留最新的一条

核心区别总结

方法优点适用场景
DISTINCT ONPG专属、性能高、可保留指定数据优先使用
DISTINCT通用、简单只需要查询去重字段的场景
GROUP BY通用、可搭配聚合函数跨数据库、需要统计的场景

总结

  1. PostgreSQL 优先用 DISTINCT ON (字段1,字段2,字段3),性能最好、功能最强;
  2. 通用场景用 DISTINCTGROUP BY
  3. 联合去重的核心:多个字段组合完全相同才会被合并