首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >了解DISTINCT vs DISTINCT vs Group by

了解DISTINCT vs DISTINCT vs Group by
EN

Stack Overflow用户
提问于 2020-05-03 00:40:27
回答 1查看 96关注 0票数 1

我有一个返回一组“记录”的查询。结果总是来自同一个表,并且应该始终是唯一的。它有一组内部连接,用于将行过滤到适当的子集。查询返回大约10列。但是,我发现它返回的是重复的行,所以我向查询添加了select distinct,这解决了重复问题,但存在严重的性能问题。

我的理解是,在这种情况下,select distinct on (records.id), id...将返回相同的结果,因为所有重复项都将具有相同的主键,并且似乎快了大约两倍。

我的其他测试表明,group by records.id甚至再次更快,而且似乎做了同样的事情?

这三种方法总是返回相同的一组单表记录,我说的对吗?

另外,有没有一种简单的方法来比较不同方法的结果,以确保集被返回?

下面是我的问题:

代码语言:javascript
复制
  SELECT DISTINCT records.*
  FROM records
  INNER JOIN records parents on parents.path @> records.path
  INNER JOIN record_types ON record_types.id = records.record_type_id
  INNER JOIN user_roles ON user_roles.record_id = parents.id AND user_roles.user_id = _user_id
  INNER JOIN memberships ON memberships.role_id = user_roles.role_id
  INNER JOIN roles ON roles.id = memberships.role_id
  INNER JOIN groups ON memberships.group_id = groups.id AND
                              groups.id = record_types.view_group_id

任何单独的记录都可以有“父”记录的树。这是使用ltree插件完成的。实际上,我们正在查看用户是否具有定义为当前记录或任何父级记录的“查看组”的组中的角色。查询实际上是一个函数,传入的是_user_id。

EN

回答 1

Stack Overflow用户

发布于 2020-05-03 01:43:42

因为您只从records中进行选择,所以您的不需要 DISTINCT;记录已经是不同的(我假设)。

因此,您遇到的重复项可能是由所有joins引起的,例如,如果多个角色或组成员与您的一条记录匹配,则相同的record将与这些引用中的每个组合。

代码语言:javascript
复制
 SELECT *
  FROM records r
  WHERE EXISTS (
        SELECT *
        FROM records pa on pa.path @> r.path
         JOIN record_types typ ON typ.id = r.record_type_id
         JOIN user_roles ur ON ur.record_id = pa.id AND ur.user_id = _user_id
         JOIN memberships mem ON mem.role_id = ur.role_id
         JOIN roles ON roles.id = mem.role_id
         JOIN groups gr ON mem.group_id = gr.id AND gr.id = typ.view_group_id
        )
        ;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61562900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档