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 ON | PG专属、性能高、可保留指定数据 | 优先使用 |
| DISTINCT | 通用、简单 | 只需要查询去重字段的场景 |
| GROUP BY | 通用、可搭配聚合函数 | 跨数据库、需要统计的场景 |
总结
- PostgreSQL 优先用
DISTINCT ON (字段1,字段2,字段3),性能最好、功能最强; - 通用场景用
DISTINCT或GROUP BY; - 联合去重的核心:多个字段组合完全相同才会被合并。