SQL/PostgreSQL:选择除self之外的所有成员

SQL/PostgreSQL:选择除self之外的所有成员,sql,postgresql,Sql,Postgresql,因此,在我的模式中,我有一个如下所示的表: CREATE TABLE group_members( group_id UUID NOT NULL, account_name TEXT NOT NULL, PRIMARY KEY (group_id, account_name) ); 假设我的帐户名是peter,我想选择符合特定条件的某些组的所有其他成员,稍后我将解释我是其中的成员。我提出了两个问题: SELECT account_name, group_id FROM

因此,在我的模式中,我有一个如下所示的表:

CREATE TABLE group_members(
  group_id UUID NOT NULL,
  account_name TEXT NOT NULL,
  PRIMARY KEY (group_id, account_name)
);
假设我的帐户名是peter,我想选择符合特定条件的某些组的所有其他成员,稍后我将解释我是其中的成员。我提出了两个问题:

SELECT account_name,
       group_id
FROM   group_members
WHERE  group_id IN
       (
          SELECT group_id
          FROM   group_members
          WHERE  account_name = 'peter'
          INTERSECT
          SELECT unnest('{"550e8400-e29b-11d4-a716-446655440000"}' :: uuid []))
AND    group_members.account_name != 'peter';

INTERSECT子查询获取组ID数组,并为peter所属的所有组对其进行筛选


我应该用哪一个?还是有更简单的方法?因为,老实说,这两个查询看起来都很可怕。

您应该测试数据的性能,并根据您的需求选择一个最好的。我倾向于第一种方法,但有一点小小的改变:

SELECT account_name,
       group_id
FROM   group_members gm
WHERE  EXISTS (SELECT 1
               FROM group_members gm2
               WHERE gm2.account_name = 'peter' AND
                     gm2.group_id = gm.group_id
              ) AND
       gm.group_id IN (SELECT unnest('{"550e8400-e29b-11d4-a716-446655440000"}' :: uuid []) AND
       gm.account_name <> 'peter';
此方法可以利用组成员组id、帐户名称上的索引。有了这样一个索引,查询应该非常快——扫描外部查询的索引,然后使用子查询的索引获取匹配项


您的版本也可能具有非常好的性能;有时,诸如UNION和INTERSECT之类的集合操作会影响使用索引的能力。

您应该测试数据的性能,并根据需要选择最佳的。我倾向于第一种方法,但有一点小小的改变:

SELECT account_name,
       group_id
FROM   group_members gm
WHERE  EXISTS (SELECT 1
               FROM group_members gm2
               WHERE gm2.account_name = 'peter' AND
                     gm2.group_id = gm.group_id
              ) AND
       gm.group_id IN (SELECT unnest('{"550e8400-e29b-11d4-a716-446655440000"}' :: uuid []) AND
       gm.account_name <> 'peter';
此方法可以利用组成员组id、帐户名称上的索引。有了这样一个索引,查询应该非常快——扫描外部查询的索引,然后使用子查询的索引获取匹配项

您的版本也可能具有非常好的性能;有时,诸如UNION和INTERSECT之类的集合操作会影响索引的使用能力