提要:在本教程中,您将学习如何使用PostgreSQL 的 SELECT DISTINCT 子句,从查询返回的结果集中删除重复的行。

SELECT DISTINCT 简介

DISTINCT 放在 SELECT 语句中,用于删除结果集中重复的行,DISTINCT 子句为每组重复项保留一行,它可用于数据表的一列或多列。

DISTINCT 子句的语法如下:

SELECT 
  DISTINCT field_1 
FROM
  table_name;

在此声明中,field_1 字段中的值用于评估重复项。

如果指定多个字段,则 DISTINCT 子句将根据这些字段的值的组合来评估重复项。

SELECT 
  DISTINCT field_1,
  field_2
FROM
  table_name;

PostgreSQL 还提供了 DISTINCT ON(表达式),用来在多字段里,依然使用第一个字段来判断是否重复。

SELECT 
  DISTINCT ON(field_1),
  field_2
FROM
  table_name
ORDER BY 
  field_1,
  field_2;

SELECT 语句返回的行的顺序是不可预知的,因此每个副本组的“第一行”也是不可预知的。所以,我们建议在使用 DISTINCT ON(表达式) 的语句时,总是使用 ORDER BY 子句进行排序,以便使返回的结果集更清晰明了。

注意:DISTINCT ON(表达式)里的 表达式,必须与 ORDER BY 子句的第一个表达式一致。

SELECT DISTINCT 示例

我们创建一个新表,并将其命名为 t1,然后往该表里插入数据,以便学习 DISTINCT 子句。

第一步,使用下面的语句创建一个名为t1的表,该表包含三个字段:idbcolorfcolor

CREATE TABLE t1 (
 id serial NOT NULL PRIMARY KEY,
 bcolor VARCHAR,
 fcolor VARCHAR
);

第二步,使用 INSERT 语句往 t1 表里插入一些数据:

INSERT INTO t1 (bcolor, fcolor)
VALUES
 ('red', 'red'),
 ('red', 'red'),
 ('red', NULL),
 (NULL, 'red'),
 ('red', 'green'),
 ('red', 'blue'),
 ('green', 'red'),
 ('green', 'blue'),
 ('green', 'green'),
 ('blue', 'red'),
 ('blue', 'green'),
 ('blue', 'blue');

第三步,使用 SELECT 语句查询 t1 表里的数据:

SELECT
 id,
 bcolor,
 fcolor
FROM
 t1;

结果如下:

t1表里的所有数据

SELECT DISTINCT 使用单字段的示例

下面的语句从 t1 表中,通过 bcolor 字段的值返回唯一的数据,同时,使用 ORDER BY 对结果集进行排序。

SELECT
 DISTINCT bcolor
FROM
 t1
ORDER BY
 bcolor;

bcolor去重

SELECT DISTINCT 使用多字段的示例

下面的语句演示了如何在 SELECT DISTINCT 使用多字段:

SELECT
 DISTINCT bcolor,
 fcolor
FROM
 t1
ORDER BY
 bcolor,
 fcolor;

多字段去重

由于我们在 SELECT DISTINCT 里指定了 bcolorfcolor 两个字段,所以 PostgreSQL 是通过组合这两个字段的值来判断是否重复。

SELECT DISTINCT ON(表达式) 示例

下面的语句返回 bcolorfcolor 两个字段的值,但是,它依然以 bcolor 字段的值作为是否重复的判断依据。同时, ORDER BY 子句的第一个表达式,必须是bcolor

SELECT
 DISTINCT ON
 (bcolor) bcolor,
 fcolor
FROM
 t1
ORDER BY
 bcolor,
 fcolor;

DISTINCT ON

下一篇:PostgreSQL的ORDER BY