Anda menginginkan sesuatu seperti ini:
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
Masalah dengan kueri asli adalah bahwa uc.constraint_name untuk tabel anak adalah nama kunci asing. Itu bagus untuk menghubungkan anak pertama ke tabel root, tetapi bukan itu yang Anda perlukan untuk menghubungkan anak-anak di tingkat kedua ke yang pertama. Itulah mengapa Anda perlu bergabung melawan batasan dua kali -- sekali untuk mendapatkan kunci utama tabel, sekali untuk mendapatkan kunci asing.
Selain itu, jika Anda akan menanyakan tampilan all_* daripada tampilan user_*, Anda biasanya ingin menggabungkannya pada table_name DAN pemilik, bukan hanya table_name. Jika beberapa skema memiliki tabel dengan nama yang sama, bergabung hanya dengan nama_tabel akan memberikan hasil yang salah.