Запрос с циклом (Oracle 10 XE и 11 XE)
Есть дорожная карта (список подключенных городов):
drop table aaa;
create table aaa(a varchar2(10), b varchar2(10));
insert into aaa values ('Rome','Berlin');
insert into aaa values ('London','Rome');
insert into aaa values ('London','New-York');
insert into aaa values ('New-York','Dallas');
Мне нужно получить путь: Берлин => Рим => Нью-Йорк => Даллас
Вариант 1:
select sys_connect_by_path(DECODE(a, PRIOR a, b, a),'=>') PATH1
from aaa
start with a = 'Berlin' or b = 'Berlin'
connect by nocycle Prior a = b or prior b = a
Вернуться: => Рим => Лондон
Вариант 2:
select sys_connect_by_path(DECODE(a, PRIOR a, b, a),'=>') PATH1
from aaa
start with a = 'Berlin' or b = 'Berlin'
connect by Prior a = b or prior b = a
Возврат: ОШИБКА ORA-01436 CONNECT BY loop в пользовательских данных
Любое предложение, как получить ожидаемый результат с иерархическим запросом?
1 ответ
Решение
select
sys_connect_by_path(b,'=>') PATH1
from
(
select
least(a, b) a,
greatest(a, b) b
from aaa
)
start with a = 0
connect by prior b = a
UPD:
select
sys_connect_by_path(b, '=>') PATH1
from
(
select a, b from aaa
union all
select b, a from aaa
union all
select null, 'Berlin' from dual
)
start with a is null
connect by nocycle prior b = a