Tsql T-SQL-如何编写查询以获取与多对多联接中的所有记录匹配的记录

Tsql T-SQL-如何编写查询以获取与多对多联接中的所有记录匹配的记录,tsql,many-to-many,Tsql,Many To Many,(我认为我没有正确地命名这个问题——但我不知道如何描述它) 以下是我试图做的: 假设我有一个Person表,它有一个PersonID字段。假设一个人可以属于许多群体。因此,有一个带有GroupID字段的组表和一个GroupMembership表,这是两个表之间的多对多联接,GroupMembership表有一个PersonID字段和一个GroupID字段。到目前为止,这是一个简单的多对多连接 给定一个GroupID列表,我希望能够编写一个查询,返回所有这些组中的所有人(而不是任何一个组)。查询应

(我认为我没有正确地命名这个问题——但我不知道如何描述它)

以下是我试图做的:

假设我有一个Person表,它有一个PersonID字段。假设一个人可以属于许多群体。因此,有一个带有GroupID字段的组表和一个GroupMembership表,这是两个表之间的多对多联接,GroupMembership表有一个PersonID字段和一个GroupID字段。到目前为止,这是一个简单的多对多连接

给定一个GroupID列表,我希望能够编写一个查询,返回所有这些组中的所有人(而不是任何一个组)。查询应该能够处理任意数量的GroupID。我希望避免使用动态SQL

有没有什么简单的方法可以做到这一点,而我却没有? 谢谢
Corey

基本上,你要找的人没有他不属于的团体,所以

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
    )
)

编辑:谢谢你,乔

从查询时动态生成查询的意义上讲,您基本上不会避免使用“动态”SQL。在SQL中没有办法传递一个列表(当然,有,表变量,但是从C#将它们输入系统是不可能的(2005年及以下),或者是恼人的(2008))


使用多个查询的一种方法是将列表插入到一个工作表(可能是一个进程键控表)中,并针对该表进行连接。唯一的其他选择是使用动态查询,如Jonathan和hongliang指定的查询。

我认为这不是他想要的拥有count(*)=@count\u of_your\u list\u of_group\u ids我猜动态SQL指的是将一个大SQL字符串连接在一起然后执行的SP。我知道这不太好,所以我尽量避免。Jonathan上面的例子似乎就是我想要的。@Aequitarum是对的,有几种方法可以拆分“varchar”并将列表作为表进行操作。毫无疑问。不过,我不确定使用工作台是否是更糟糕的选择。不完全是。我正在寻找一个人谁是在一些给定的组列表中的所有组的成员。
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]