Bạn muốn một cái gì đó như thế này:
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
Vấn đề với truy vấn ban đầu là uc.constraint_name cho bảng con là tên của khóa ngoại. Điều đó là tốt cho việc kết nối con đầu tiên với bảng gốc, nhưng nó không phải là những gì bạn cần để kết nối các con ở cấp độ thứ hai với cấp độ đầu tiên. Đó là lý do tại sao bạn cần tham gia chống lại các ràng buộc hai lần - một lần để lấy khóa chính của bảng, một lần để lấy khóa ngoài.
Ngoài ra, nếu bạn định truy vấn các chế độ xem all_ * thay vì các chế độ xem user_ *, bạn thường muốn kết hợp chúng trên table_name VÀ chủ sở hữu, không chỉ table_name. Nếu nhiều lược đồ có các bảng trùng tên, việc chỉ kết hợp trên table_name sẽ cho kết quả không chính xác.