SQL encontra conjuntos com membros comuns (divisão relacional)

Eu tenho conjuntos separados de "classes" e "grupos", cada um dos quais foi atribuído um ou mais tags. Eu gostaria de encontrar, para cada grupo, o subconjunto de classes que contém as mesmas (ou mais) tags para cada grupo.

Alguns dados de amostra:

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

E saída:

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

Um exemplo de conjunto de resultados seria assim:

declare @Results table
(
    GroupID int,
    ClassID int
)

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

select * from @Results

Resultados da saída:

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

Eu entendo que este é um problema do tipo de divisão relacional, envolvendohaving ecount. Essas postagens descrevem o que eu quero fazer, mas não consigo descobrir como aplicar os exemplos ao caso específico acima:

http://weblogs.sqlteam.com/peterl/archive/2010/07/02/Proper-Relational-Division-With-Sets.aspxJunção SQL somente se todos os registros tiverem uma correspondênciaComo posso estruturar uma consulta para me fornecer somente as linhas que correspondem a todos os valores em uma lista de IDs do CSV no T-SQLSQL: selecione conjuntos contendo membros exatamente indicadosUma consulta sql para localizar usuários com tags comuns em um conjunto definido

questionAnswers(2)

yourAnswerToTheQuestion