Vuoi qualcosa del genere:
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
Il problema con la query originale è che uc.constraint_name per la tabella figlio è il nome della chiave esterna. Va bene per connettere il primo figlio alla tabella radice, ma non è ciò di cui hai bisogno per connettere i bambini del secondo livello al primo. Ecco perché devi unirti contro i vincoli due volte:una per ottenere la chiave primaria della tabella, una per ottenere le chiavi esterne.
Per inciso, se hai intenzione di interrogare le viste all_* piuttosto che le viste utente_*, generalmente vuoi unirti a nome_tabella E proprietario, non solo nome_tabella. Se più schemi hanno tabelle con lo stesso nome, l'unione su solo nome_tabella darà risultati errati.