Как можно определить кольцевую цепочку операций?

Данная задачкa попалась мне на собеседовании:

Допустим Ваня должен 100 рублей Коле,
Коля сам должен 100 рублей Кате,
......
Олег должен 100 рублей Ване.

Круг замкнулся.
Как можно определить такую кольцевую цепочку операций?


Ответы (2 шт):

Автор решения: gbg

Deadlock aka Взаимная блокировка

Deadlock

→ Ссылка
Автор решения: 0xdb

Интервьюер просил составить простенький запрос для иерархической последовательности с нахождением цикла.

Примерно такой:

with recursiveSubqueryFactoring (name, owesTo) as (
    select name, owesTo
    from testdata
    where name = 'Ваня'
    union all
    select td.name, td.owesTo
    from testdata td
    join recursiveSubqueryFactoring rsf on rsf.name = td.owesTo 
)
search depth first by name set sortCol
cycle name set isCycle to 'y' default 'n'
select 
    case isCycle 
    when 'n' then name||' должен 100 руб. '||owesTo 
    when 'y' then 'но у '||owesTo||' же должник '||name end "кто-кому",
    case isCycle when 'n' then 'вернёт' when 'y' then 'цепочка замкнулась, как быть?' 
    end "что будет"
from recursiveSubqueryFactoring 
order by sortCol;

Результат:

кто-кому                         что будет                    
-------------------------------- -----------------------------
Ваня должен 100 руб. Коля        вернёт                       
Олег должен 100 руб. Ваня        вернёт                       
Катя должен 100 руб. Олег        вернёт                       
Коля должен 100 руб. Катя        вернёт                       
но у Коля же должник Ваня        цепочка замкнулась, как быть?

Данные для примера:

create table testdata (name varchar (16), owesTo varchar (16));
insert into testdata values ('Ваня','Коля');
insert into testdata values ('Коля','Катя');
insert into testdata values ('Катя','Олег');
insert into testdata values ('Олег','Ваня');
→ Ссылка