2013-05-01 37 views
4

我有單獨的「類」和「組」組,其中每個組都有一個或多個標籤。我想爲每個組找出包含每個組相同(或更多)標籤的類的子集。SQL查詢集與普通成員(關係部門)

某些樣本數據:

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。這些職位描述一下我想做的事,但我無法弄清楚如何將示例適用於上述的特殊情況:

回答

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 
+0

歡迎來到SO!和+1來獲得雙重否定方法。我會嘗試在生產環境中避免這種情況,因爲除非您熟悉它,否則會非常困惑。 – Andomar 2013-05-01 10:13:39

+0

謝謝,標記爲空組正確返回null的答案。 – Tamar 2013-05-01 10:37:19

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.

+0

謝謝!這看起來像是做這項工作,現在遠離測試系統,但一旦完全測試就會確認。 「 – Tamar 2013-05-01 09:03:17

+0

」要求組中的所有標籤都在該類中找到「......感謝您的明確邏輯,子查詢是我的缺失鏈接。 – Tamar 2013-05-01 09:07:19