TSQL CTE: как избежать циклического обхода?

Я написал очень простое CTE-выражение, которое извлекает список всех групп, членом которых является пользователь.

Правила выглядят следующим образом: пользователь может состоять в нескольких группах, и группы могут быть вложенными, так что группа может быть членом другой группы, и, кроме того, группы могут быть общими членами другой группы, поэтому группа А является член группы 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 слишком грубо, не так ли?

Есть ли лучший способ?

11
задан Haoest 14 June 2012 в 21:45
поделиться