我有独立的"类"one_answers"组"集,每一个都被分配了一个或多个标签。我想为每个组找到包含每个组相同(或更多)标记的类子集。
一些示例数据:
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
我理解这是一个关系除法类型的问题,涉及到having
和count
。这些帖子描述了我想做的事情,但我不知道如何将这些例子应用到上面的特定情况:
- http://weblogs.sqlteam.com/peterl/archive/2010/07/02/Proper-Relational-Division-With-Sets.aspx
- SQL仅在所有记录都有匹配时才加入
- 我如何构建一个查询,只给我匹配所有值在T-SQL id的CSV列表中的行
- SQL: select set包含指定的成员
- 一个sql查询,用于在定义的集合中查找具有公共标记的用户
我想这应该也能行
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
您可以将表连接在一起,并要求该组中的所有标记都在类中找到:
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
)
这没有列出没有匹配类的组,我想不出一个简单的方法来做到这一点。