Я работаю со столом гупс.
GroupMembers (GroupName, MemberName)
Для каждого члена группы имеется строка, и группа может содержать другие группы и пользователей.
Я хотел бы извлечь список пар GroupName, MemberName, где MemberName - это только список пользователей. По сути, расплющить дерево. Я делал что-то похожее на это раньше и вручную писал запросы, которые экспортировали листы каждого уровня в отдельную таблицу, а затем объединяли это, как только я достиг последнего уровня.
Дерево выглядит несбалансированным и не имеет фиксированного количества уровней. Я смотрел на примеры рекурсивных запросов, и мне не особо повезло в их реализации.
Есть ли у кого-нибудь хорошие указатели на то, куда я могу обратиться, чтобы предложить им элегантное решение?
Большое спасибо!
ps Если это поможет, я работаю с SQL Server 2008.
ОБНОВЛЕНИЕ: я наткнулся на Рекурсивный CTE. Моя единственная проблема в том, что в данных есть циклические ссылки: (.
Этот код я использовал для запроса: -
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)
Есть ли способ исключить циклические ссылки / очистить данные перед выполнением вышеуказанного запроса?
Спасибо!
Пример циклического / кругового эталона
Пример циклической ссылки может быть в том случае, если данные содержат следующее: -
GroupMember, MemberName
Group1, Group2
Group1, User1
Group2, Group3
Group2, User2
Group3, Group1
Спасибо за отзыв, Микаэль!