Как вариант на деревьях для девятки:
--
-- Тестовые данные:
WITH a AS (
SELECT 1 id1, 'b' NAME, 2 nasl_id FROM dual UNION ALL
SELECT 2 id1, 'b' NAME, 3 nasl_id FROM dual UNION ALL
SELECT 3 id1, 'c' NAME, 5 nasl_id FROM dual UNION ALL
SELECT 5 id1, 'd' NAME, 20 nasl_id FROM dual UNION ALL
SELECT 13 id1, 'e' NAME, 14 nasl_id FROM dual UNION ALL
SELECT 14 id1, 'f' NAME, 17 nasl_id FROM dual UNION ALL
SELECT 17 id1, 'g' NAME, 19 nasl_id FROM dual UNION ALL
SELECT 11 id1, 'h' NAME, 12 nasl_id FROM dual UNION ALL
SELECT 12 id1, 'j' NAME, 35 nasl_id FROM dual)
--
-- Основной запрос:
select id1, name, nasl_id,
--
-- Замена CONNECT_BY_ROOT для версии Oracle 9i
replace(sys_connect_by_path(decode(level,1,id1),','),',') as root_id
from a a1
start with not exists(select null from a a0 where a0.nasl_id = a1.id1)
connect by id1 = prior nasl_id
Query finished, retrieving results...
ID1 NAME NASL_ID ROOT_ID
--- ---- ------- -------
1 b 2 1
2 b 3 1
3 c 5 1
5 d 20 1
11 h 12 11
12 j 35 11
13 e 14 13
14 f 17 13
17 g 19 13
9 row(s) retrieved