(我认为我没有正确地提出这个问题 - 但我不知道如何描述它)
以下是我要做的事情:
假设我有一个具有PersonID字段的Person表。让我们说一个人可以属于许多群体。因此,存在具有GroupID字段的Group表和GroupMembership表,GroupMembership表是两个表之间的多对多连接,GroupMembership表具有PersonID字段和GroupID字段。到目前为止,这是一个简单的多对多加入。
给定一个GroupID列表,我希望能够编写一个查询,返回所有这些组中的所有人(不是这些组中的任何一个)。并且查询应该能够处理任意数量的GroupID。我想避免使用动态SQL。
是否有一些简单的方法可以解决这个问题? 谢谢, 科里
答案 0 :(得分:6)
select person_id, count(*) from groupmembership
where group_id in ([your list of group ids])
group by person_id
having count(*) = [size of your list of group ids]
编辑:谢谢dotjoe!
答案 1 :(得分:0)
基本上你正在寻找没有他不属于的团体的人,所以
select *
from Person p
where not exists (
select 1
from Group g
where not exists (
select 1
from GroupMembership gm
where gm.PersonID = p.ID
and gm.GroupID = g.ID
)
)
答案 2 :(得分:0)
在查询时动态生成查询的意义上,你基本上不会避免使用“动态”SQL。没有办法在SQL中提供一个列表(好吧,有表变量,但是从C#进入系统是不可能的(2005年及以下)或者讨厌(2008))。
您可以使用多个查询执行此操作的一种方法是将列表插入到工作表(可能是一个进程键控表)中并加入该表。唯一的另一种选择是使用动态查询,例如Jonathan和hongliang指定的动态查询。