TSQL CTE: как избежать кругового обхода?
Я написал очень простое выражение CTE, которое возвращает список всех групп, членом которых является пользователь.
Правила действуют следующим образом: пользователь может входить в несколько групп, а группы могут быть вложенными, так что группа может быть членом другой группы, и, кроме того, группы могут быть взаимными членами другой, поэтому группа A является членом группы. B и группа B также является членом группы A.
Мой CTE выглядит следующим образом и, очевидно, дает бесконечную рекурсию:
;WITH GetMembershipInfo(entityId) AS( -- entity can be a user or group
SELECT k.ID as entityId FROM entities k WHERE k.id = @userId
UNION ALL
SELECT k.id FROM entities k
JOIN Xrelationships kc on kc.entityId = k.entityId
JOIN GetMembershipInfo m on m.entityId = kc.ChildID
)
Я не могу найти простое решение, чтобы отследить те группы, которые я уже записал.
Я думал об использовании дополнительного параметра varchar в CTE для записи списка всех групп, которые я посетил, но использование varchar слишком грубо, не так ли?
Есть ли способ лучше?