【问题标题】:T-SQL - How to write query to get records that match ALL records in a many to many joinT-SQL - 如何编写查询以获取与多对多连接中的所有记录匹配的记录
【发布时间】:2009-12-04 20:42:22
【问题描述】:

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

这是我想要做的:

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

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

是否有一些我想念的简单方法? 谢谢, 科里

【问题讨论】:

    标签: tsql many-to-many


    【解决方案1】:
    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!

    【讨论】:

    • 我不认为这是他想要的
    • 拥有 count(*) = @count_of_your_list_of_group_ids
    【解决方案2】:

    基本上你正在寻找没有他不属于的组的人,所以

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

    【讨论】:

    • 不完全是。我正在寻找一个人,他是某个给定组列表中所有组的成员。
    【解决方案3】:

    在查询时动态生成查询的意义上,您基本上不会避免“动态”SQL。没有办法在 SQL 中传递列表(嗯,有表变量,但是从 C# 将它们导入系统要么是不可能的(2005 年及以下),要么是烦人的(2008 年))。

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

    【讨论】:

    • 我猜动态 SQL 是指一个 SP,它将一个大的 SQL 字符串连接在一起,然后执行它。我知道这表现不佳,所以我试图避免这种情况。上面乔纳森的例子似乎就是我要找的。​​span>
    • @Aequitarum 是对的,有几种方法可以拆分“varchar”并将列表操作为表格。
    • 毫无疑问。不过,我不确定使用工作台是不是更糟糕的选择。
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 2017-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多