select parent, child, level from (
select parent_table.table_name parent, child_table.table_name child
from user_tables parent_table,
user_constraints parent_constraint,
user_constraints child_constraint,
user_tables child_table
where parent_table.table_name = parent_constraint.table_name
and parent_constraint.constraint_type IN( 'P', 'U' )
and child_constraint.r_constraint_name = parent_constraint.constraint_name
and child_constraint.constraint_type = 'R'
and child_table.table_name = child_constraint.table_name
and child_table.table_name != parent_table.table_name
)
start with parent = 'DEPT'
connect by prior child = parent
sẽ hoạt động (tất nhiên là thay thế tên bảng) giả sử rằng mọi thứ đều nằm trong cùng một lược đồ. Sử dụng phiên bản DBA_ của bảng từ điển dữ liệu và các điều kiện cho cột CHỦ SỞ HỮU và R_OWNER nếu bạn cần xử lý các phụ thuộc lược đồ chéo. Khi phản ánh thêm, điều này không giải thích cho các ràng buộc tự tham chiếu (tức là một ràng buộc trên bảng EMP mà cột MGR tham chiếu đến cột EMPNO), vì vậy bạn sẽ phải sửa đổi mã để xử lý trường hợp đó nếu bạn cần xử lý với các ràng buộc tự tham chiếu.
Với mục đích thử nghiệm, tôi đã thêm một vài bảng mới vào lược đồ SCOTT cũng tham chiếu đến bảng DEPT (bao gồm cả phần phụ thuộc cháu)
SQL> create table dept_child2 (
2 deptno number references dept( deptno )
3 );
Table created.
SQL> create table dept_child3 (
2 dept_child3_no number primary key,
3 deptno number references dept( deptno )
4 );
Table created.
SQL> create table dept_grandchild (
2 dept_child3_no number references dept_child3( dept_child3_no )
3 );
Table created.
và xác minh rằng truy vấn trả lại kết quả mong đợi
SQL> ed
Wrote file afiedt.buf
1 select parent, child, level from (
2 select parent_table.table_name parent, child_table.table_name child
3 from user_tables parent_table,
4 user_constraints parent_constraint,
5 user_constraints child_constraint,
6 user_tables child_table
7 where parent_table.table_name = parent_constraint.table_name
8 and parent_constraint.constraint_type IN( 'P', 'U' )
9 and child_constraint.r_constraint_name = parent_constraint.constraint_name
10 and child_constraint.constraint_type = 'R'
11 and child_table.table_name = child_constraint.table_name
12 and child_table.table_name != parent_table.table_name
13 )
14 start with parent = 'DEPT'
15* connect by prior child = parent
SQL> /
PARENT CHILD LEVEL
------------------------------ ------------------------------ ----------
DEPT DEPT_CHILD3 1
DEPT_CHILD3 DEPT_GRANDCHILD 2
DEPT DEPT_CHILD2 1
DEPT EMP 1