Это немного громоздко, но я считаю, что это должно работать (без дополнительного объединения). Это предполагает, что вы можете выбрать символ, который никогда не появится в соответствующем поле, в качестве разделителя.
Вы можете сделать это, не вкладывая select, но я нахожу это немного чище, в котором есть четыре ссылки на SYS_CONNECT_BY_PATH.
select id,
parent_id,
case
when lvl <> 1
then substr(name_path,
instr(name_path,'|',1,lvl-1)+1,
instr(name_path,'|',1,lvl)
-instr(name_path,'|',1,lvl-1)-1)
end as name
from (
SELECT id, parent_id, sys_connect_by_path(name,'|') as name_path, level as lvl
FROM tbl
START WITH id = 1
CONNECT BY PRIOR id = parent_id)