Chcete něco takového:
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
Problém s původním dotazem je, že uc.constraint_name pro podřízenou tabulku je název cizího klíče. To je v pořádku pro připojení prvního potomka ke kořenové tabulce, ale není to to, co potřebujete k připojení dětí na druhé úrovni k první. Proto se musíte proti omezením připojit dvakrát – jednou pro získání primárního klíče tabulky, jednou pro získání cizích klíčů.
Kromě toho, pokud se budete dotazovat na pohledy all_* spíše než na pohledy user_*, obecně je chcete připojit na jméno_tabulky A vlastník, nikoli pouze název_tabulky. Pokud má více schémat tabulky se stejným názvem, spojení pouze na název_tabulky poskytne nesprávné výsledky.