Вопрос
У меня есть рекурсивный запрос CTE, но он не работает при создании цикла. Я уже исправил простые циклы (например, 1 -> 2 -> 1), но не могу исправить более сложные циклы (например, 1 -> 2 -> 3 -> 2).
Детали запроса
В тестовой таблице есть два столбца: Базовый и Родительский. Мне нужен список всех предков.
Мой запрос работает с образцом данных ниже, если вы начинаете с test2, но не с test1.
Образцы данных
Base Parent
---- ------
test1 test2
test2 test3
test3 test2
SQL-запрос (моя попытка исправить отмечена в комментариях)
;with sample_data (Base, Parent) as (
select 'test1', 'test2'
union select 'test2', 'test3'
union select 'test3', 'test2'
),
nt_list (Base, Ancestor, [level]) as (
select Base,
Parent Ancestor,
1 [level]
from sample_data
where Base = 'test1' -- START HERE
union all
select ntl.Base,
nt.Parent,
ntl.[level] + 1 [level]
from nt_list ntl
join sample_data nt on ntl.Ancestor = nt.Base
where nt.Parent <> ntl.Base -- fix recursive bug (e.g. 1 -> 2 -> 1)
-- WHAT I TRIED TO ADD BUT CANNOT: (e.g. 1 -> 2 -> 3 -> 2)
and nt.Parent in (select Ancestor from nt_list)
)
select distinct
ntl.Base,
ntl.Ancestor
from nt_list ntl
order by Ancestor
Ошибка SQL: рекурсивный член общего табличного выражения nt_list имеет несколько рекурсивных ссылок.