Du vill ha något sånt här:
select t.table_name, level,lpad(' ', 2 * (level - 1))||t.table_name
from user_tables t
join user_constraints c1
on (t.table_name = c1.table_name
and c1.constraint_type in ('U', 'P'))
left join user_constraints c2
on (t.table_name = c2.table_name
and c2.constraint_type='R')
start with t.table_name = 'ROOT_TAB'
connect by prior c1.constraint_name = c2.r_constraint_name
Problemet med den ursprungliga frågan är att uc.constraint_name för den underordnade tabellen är namnet på den främmande nyckeln. Det är bra för att koppla det första barnet till rotbordet, men det är inte vad du behöver för att koppla barnen på den andra nivån till den första. Det är därför du måste gå med mot begränsningarna två gånger - en gång för att få tabellens primärnyckel, en gång för att få främmande nycklar.
För övrigt, om du ska fråga alla_*-vyerna snarare än user_*-vyerna, vill du i allmänhet gå med dem på tabellnamn OCH ägare, inte bara tabellnamn. Om flera scheman har tabeller med samma namn, kommer koppling på bara tabellnamn att ge felaktiga resultat.