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)但是我遇到了一些麻烦..
任何人都可以对一个好的解决方案有所了解吗?
答案 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
。