具有共同成员的SQL查找集(关系部)

时间:2013-05-01 07:46:51

标签: sql sql-server sql-server-2008 tsql relational-division

我有一组单独的“类”和“组”,每组都分配了一个或多个标签。我想为每个组找到包含每个组相同(或更多)标记的类子集。

一些示例数据:

declare @Groups table
(
    GroupID int,
    TagID int
)

insert @Groups
values (1,1),(1,2),(1,3),
    (2,1),(2,2),
    (3,1),(3,2),(3,3),(3,4)

declare @Classes table
(
    ClassID int,
    TagID int
)

insert @Classes
values (1,1),(1,2),
    (2,1),(2,2),
    (3,1),(3,2),(3,3)

select * from @Groups
select * from @Classes

输出:

GroupID TagID
1       1
1       2
1       3
2       1
2       2
3       1
3       2
3       3
3       4

ClassID TagID
1       1
1       2
2       1
2       2
3       1
3       2
3       3

示例结果集如下所示:

declare @Results table
(
    GroupID int,
    ClassID int
)

insert @Results
values (1,3),(2,1),(2,2),(2,3),(3,null)

select * from @Results

结果输出:

GroupID ClassID
1       3
2       1
2       2
2       3
3       NULL

我理解这是一个关系分类型问题,涉及havingcount。这些帖子描述了我想做的事情,但我无法弄清楚如何将这些例子应用于上述特定情况:

2 个答案:

答案 0 :(得分:4)

我认为这也应该有用

select distinct g.GroupID, c.ClassID
from @Groups g
    left join @Classes c on g.TagID = c.TagID
where not exists (
    select *
    from @Groups g2
    where g2.GroupID = g.GroupID
        and g2.TagID not in (
            select TagID
            from @Classes c2
            where c2.ClassID = c.ClassID
        )
    ) or c.ClassID is null

答案 1 :(得分:2)

您可以将这些表连接在一起,并要求在该类中找到该组中的所有标记:

select  g.GroupID
,       c.ClassID
from    @Groups g
join    @Classes c
on      c.TagID = g.TagID
group by
        g.GroupID
,       c.ClassID
having  count(c.TagID) =
        (
        select  count(*)
        from    @Groups g2
        where   g2.GroupID = g.GroupID
        )

这不列出没有匹配类的组,我想不出一个简单的方法。

Example at SQL Fiddle.