Estoy trabajando con una tabla de grupos.Aplanamiento de un árbol de membresía grupal en SQL (con referencias cíclicas)
GroupMembers (nombre de grupo, MemberName)
Hay una fila presente para cada miembro del grupo y un grupo puede contener otros grupos y usuarios.
Me gustaría extraer una lista de pares de GroupName, MemberName donde MemberName es solo una lista de usuarios. Básicamente, aplanando el árbol. He hecho algo similar a esto antes y escribí manualmente las consultas que exportaban las hojas de cada nivel a una tabla separada y luego las consolidé una vez que había alcanzado el último nivel.
El árbol parece estar desbalanceado y no tiene ningún número fijo de niveles. He estado buscando ejemplos de consultas recursivas y no he tenido mucha suerte en su implementación.
¿Alguien tiene algún buen consejo sobre dónde puedo encontrar una solución elegante para esto?
¡Muchas gracias!
ps Si ayuda, estoy trabajando con SQL Server 2008.
ACTUALIZACIÓN: Me topé con CTE recursiva. Mi único problema es que hay referencias cíclicas en los datos :(
Este código que he usado para la consulta: -.
WITH Members AS
(
--Init
SELECT GroupName, MemberName
FROM GroupMembers
WHERE MemberName NOT IN (Select GroupName from GroupMembers)
UNION ALL
--Recursive Exe
SELECT h.GroupName, h.MemberName
FROM GroupMembers h INNER JOIN Members m
ON h.MemberName = m.GroupName
)
Select * into GroupMembersFlattened from Members OPTION (MAXRECURSION 1500)
¿Hay una manera de excluir las referencias cíclicas/Clense los datos antes de la ejecución de la consulta anterior?
Gracias!
ejemplo cíclica/Circular referencia un ejemplo de una referencia cíclica sería donde el da ta contiene lo siguiente: -
GroupMember, MemberName
Group1, Group2
Group1, User1
Group2, Group3
Group2, User2
Group3, Group1
Gracias por el consejo Mikael!
Sería útil si se pudiera proporcionar algunos datos de entrada de la muestra con una referencia cíclica y lo que la esperada la salida debe ser. –
Entonces, en el ejemplo anterior, los grupos 1, 2 y 3 deben tratarse como el mismo grupo, ¿no? Y tanto 'User1' como' User2' deberían pertenecer a todos los 'Group1',' Group2' y 'Group3'? –
Hola JP, solo estoy volando esto, pero ¿podrías definir tu selección como distinta? No estoy seguro, pero eso podría detener la recursión. Solo un pensamiento –