SQL Recursion CTE бесконечный цикл - PullRequest
0 голосов
/ 10 октября 2019

У меня есть этот пример, который я не могу понять, и я надеюсь, что вы могли бы помочь мне с этим!

У меня есть таблица железнодорожных линий, которая выглядит следующим образом:

enter image description here

Задача состоит в том, чтобы получить все возможные пункты назначения с заданного начала (рекурсивно).

Я пытался сделать это так:

    with cte (st, nd) as(
    select from1, to1
    from RailwayTbl
    where from1 = 'Berlin'

    union all

    select e.from1, e.to1
    from RailwayTbl e join cte
    on cte.nd = e.from1
    )
    select * from cte;

При выполнении я получил следующую ошибку:

Оператор завершен. Максимальная рекурсия 100 была исчерпана до завершения оператора. ((Это бесконечный цикл ..))

И когда я удалил all и использовал union только я получил эту ошибку:

Рекурсивный общийтабличное выражение 'cte' не содержит оператора UNION ALL верхнего уровня.

Есть идеи ?? Заранее спасибо!

1 Ответ

0 голосов
/ 10 октября 2019

Вам необходимо остановить рекурсию, которая является проблемой в SQL Server. Ниже приведен список посещенных станций для остановки рекурсии:

 with cte as (
       select from1 as st, to1 as nd, concat(',', st, ',', to1) as dests, 1 as lev
       from RailwayTbl
       where from1 = 'Berlin'
       union all
       select e.from1, e.to1, concat(cte.dests, e.to1, ',') as dests, lev + 1
       from RailwayTbl e join
            cte
            on cte.nd = e.from1
       where dests not like concat('%,', e.nd, ',%')
    )
select * from cte;

Я также добавил lev. Часто я использую where lev < 10 в рекурсивной части определения cte для отладки.

...