Рекурсия SQL Server, генерирующая полное вложенное членство

Я могу сгенерировать рекурсивный запрос благодаря этому посту: Рекурсия SQL Server с несколькими таблицами

Но теперь я пытаюсь получить полный список всех родительских/дочерних отношений для нескольких уровней. Вот пример:

fiddle

В приведенном выше примере посещенный столбец находится там, потому что в моем полном наборе данных у нас есть много циклов и мест, где родительский элемент равен дочернему, а без него были бы бесконечные циклы.

Это в основном работает, за исключением 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

Якуб
Вопрос задан10 января 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.