Как можно определить кольцевую цепочку операций?
Данная задачкa попалась мне на собеседовании:
Допустим Ваня должен 100 рублей Коле,
Коля сам должен 100 рублей Кате,
......
Олег должен 100 рублей Ване.
Круг замкнулся.
Как можно определить такую кольцевую цепочку операций?
Ответы (2 шт):
Автор решения: 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 ('Олег','Ваня');
