Я могу сгенерировать рекурсивный запрос благодаря этому посту: Рекурсия SQL Server с несколькими таблицами
Но теперь я пытаюсь получить полный список всех родительских/дочерних отношений для нескольких уровней. Вот пример:
В приведенном выше примере посещенный столбец находится там, потому что в моем полном наборе данных у нас есть много циклов и мест, где родительский элемент равен дочернему, а без него были бы бесконечные циклы.
Это в основном работает, за исключением 4-й строки, где мы снова видим родительский элемент для группы 80-79. Я бы надеялся увидеть одну строку, где 80 дает 79 (правильно), а строка уровня 2 должна быть 78 дает 79 (так и есть, потому что 80 в середине).
Есть ли способ, чтобы уровни 2 (и выше, поскольку у нас может быть до 10-20 уровней) показывали все возможные комбинации, все способы, которыми мне может быть предоставлено 79?
И есть ли лучший способ предотвратить бесконечный цикл, чем это предложение string concat/where?
Спасибо!
create table groups_groups (
[group_id] int not null,
[child_id] int not null
)
create table groups(group_id int not null)
insert into groups_groups values (78,80)
insert into groups_groups values (80,79)
insert into groups values (78)
insert into groups values (70)
insert into groups values (80)
;
with cte as (
select 0 as gglevel, 0 as parentid, groups.group_id , convert(varchar(max), concat(',', 0,':',groups.group_id)) as visited from groups
union all
select gglevel+1 as gglevel, gg.group_id as parentid, gg.child_id,convert(varchar(max), concat(cte.visited,',',gg.group_id,':',gg.child_id)) as visited
from cte
join groups_groups gg on gg.group_id = cte.group_id
where visited not like concat('%,',gg.group_id,':',gg.child_id, ',%')
)
select * from cte
order by group_id,gglevel