PostgreSQL:SELECT DISTINCT vs SELECT DISTINCT ON(id)

时间:2016-09-16 23:10:39

标签: sql performance postgresql select distinct

让许多用户属于多个群组。

CREATE TABLE users (
    id bigserial PRIMARY KEY,
    username varchar(50) NOT NULL
);

CREATE TABLE groups (
    id bigserial PRIMARY KEY,
    name varchar(50)
);

CREATE TABLE group_members (
    group_id bigint NOT NULL REFERENCES groups ON DELETE CASCADE,
    user_id bigint NOT NULL REFERENCES users ON DELETE CASCADE,
    PRIMARY KEY (group_id, user_id)
);

获取属于群组的所有用户的集合。

SELECT DISTINCT u.id, username
FROM groups AS g
JOIN group_members AS m
ON m.group_id = g.id
JOIN users AS u
ON u.id = m.user_id

请参阅this SQL Fiddle

使用SELECT DISTINCT ON (id)(在上面的SELECT查询中)而不是SELECT DISTINCT会更快吗?

两个查询都返回相同的结果集。我宁愿使用SELECT DISTINCT因为它更清洁。

但是,假设users表有几列。 SELECT DISTINCT是否足够智能,只需检查id列(而不是所有列)是否有重复项?

1 个答案:

答案 0 :(得分:1)

如果您从users表中选择 only ,则 不需要 (我希望用户已经不同了)

SELECT u.id, u.username
FROM users AS u
WHERE EXISTS ( SELECT *
    FROM  group_members AS m
    WHERE u.id = m.user_id
    );

并且您不需要加入groups表,因为group_members表中的FK保证它存在。