Запрос с циклом (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
Другие вопросы по тегам