Conjuntos de búsqueda de SQL con miembros comunes (división relacional)

Tengo conjuntos separados de "clases" y "grupos", a cada uno de los cuales se les ha asignado una o más etiquetas. Me gustaría encontrar, para cada grupo, el subconjunto de clases que contiene las mismas (o más) etiquetas para cada grupo.

Algunos datos de muestra:

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

Y salida:

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

Un conjunto de resultados de ejemplo se vería así:

declare @Results table
(
    GroupID int,
    ClassID int
)

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

select * from @Results

Resultados de salida:

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

Entiendo que este es un problema de tipo de división relacional, que involucrahaving ycount. Estas publicaciones describen lo que quiero hacer, pero no puedo averiguar cómo aplicar los ejemplos al caso particular anterior:

http://weblogs.sqlteam.com/peterl/archive/2010/07/02/Proper-Relational-Division-With-Sets.aspxÚnase a SQL solo si todos los registros tienen una coincidencia¿Cómo puedo estructurar una consulta para darme solo las filas que coinciden con TODOS los valores en una lista CSV de ID en T-SQL?SQL: conjuntos seleccionados que contienen exactamente miembros dadosUna consulta SQL para encontrar usuarios con etiquetas comunes en un conjunto definido

Respuestas a la pregunta(2)

Su respuesta a la pregunta