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之类的集合操作会影响索引的使用能力