Искате нещо подобно:
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
Проблемът с оригиналната заявка е, че uc.constraint_name за дъщерната таблица е името на външния ключ. Това е добре за свързване на първото дете към основната таблица, но не е това, от което се нуждаете, за да свържете децата на второто ниво към първото. Ето защо трябва да се присъедините срещу ограниченията два пъти -- веднъж, за да получите първичния ключ на таблицата, веднъж, за да получите външните ключове.
Като настрана, ако ще правите запитвания към all_* изгледите, а не към user_* изгледите, обикновено искате да ги присъедините към table_name И собственик, а не само table_name. Ако няколко схеми имат таблици с едно и също име, присъединяването само към table_name ще даде неправилни резултати.