SQL Server - 查找所有指定组中的人员

时间:2015-03-20 23:33:13

标签: sql sql-server

declare @person_groups table (person_id int NOT NULL, group_id int NOT NULL)
insert into @person_groups(person_id, group_id) values (1000, 501) --sample data
insert into @person_groups(person_id, group_id) values (1001, 501) --sample data
insert into @person_groups(person_id, group_id) values (1001, 502) --sample data
insert into @person_groups(person_id, group_id) values (1001, 503) --sample data
insert into @person_groups(person_id, group_id) values (1002, 502) --sample data
insert into @person_groups(person_id, group_id) values (1002, 503) --sample data

declare @tempGroupList table (group_id int)
insert into @tempGroupList(group_id) values (501) --sample data
insert into @tempGroupList(group_id) values (502) --sample data
insert into @tempGroupList(group_id) values (503) --sample data

我需要找到表@person_groups中的人ID,他们分别在@tempGroupList中列出的每个组中

501,502,503,......的组列表的伪代码:

SELECT person_id 
FROM   @person_groups 
WHERE  person_id is a member of group #501 
and that same person is also a member of group #502
   and that same person is also a member of group #503) 
   and so on for each group id contained in @tempGroupList)

我目前正在用光标做这个(很难,我知道)。我试图在MS SQL Server上重构这个(直到2012年)不使用游标(也不是动态的sql)但是我遇到了一些麻烦..

任何人都可以对一个好的解决方案有所了解吗?

1 个答案:

答案 0 :(得分:2)

select
    g.person_id
from
    @person_groups g
        inner join
    @tempGroupList l
        on g.group_id = l.group_id
group by
    g.person_id
having
    count(distinct g.group_id) = (select count(*) from @tempGroupList);

稍微解释一下。 inner join将我们限制在有问题的群组中。 group by允许我们计算每个人所在的不同(不同)群组的数量。having过滤到适当数量的不同群组中的人。

如果一个人只能在每个群组中出现一次(例如group_id, person_id中的@person_groups是一个独特的组合),那么您就不需要distinct