前段时间发连连一个查询数据库主外键关系的文章(http://space6212.itpub.net/post/12157/107584),但有个缺点:不能一目了然地查看多层级联关系,故今天根据以前对sql作了一些改进,以树状结构显式多层级联关系,这对于处理设置了级联删除的表非常有用
SQL> select distinct * from (select ltrim(sys_connect_by_path(pk_table||'('||pk_col||')','->'),'->') pk_fk from (
2 select
3 pk_table,
4 fk_table,
5 pk_col
6 from
7 (select
8 a.constraint_name pk_con,
9 a.table_name pk_table,b.column_name pk_col,
10 a.owner pk_owner
11 from user_constraints a,user_cons_columns b
12 where (a.constraint_type='P' or a.constraint_type='U')
13 and a.constraint_name=b.constraint_name
14 and a.owner=b.owner) pk,
15 (select c.constraint_name fk_con,
16 c.table_name fk_table,
17 d.column_name fk_col,
18 c.R_OWNER r_pk_owner,
19 c.R_CONSTRAINT_NAME r_pk_con,
20 c.owner fk_owner
21 from user_constraints c,user_cons_columns d
22 where c.constraint_type='R'
23 and c.constraint_name=d.constraint_name
24 and c.owner=d.owner) fk
25 where
26 pk.pk_owner=fk.r_pk_owner(+)
27 and pk.pk_con=fk.r_pk_con(+)
28 order by pk.pk_con
29 )
30 connect by prior fk_table=pk_table ) t where instr(pk_fk,'->')>0 order by 1
31 ;
PK_FK
--------------------------------------------------------------------------------
T1(ID)->T2(NEWT2ID)
T1(ID)->T2(NEWT2ID)->T3(ID)
T1(ID)->T3(ID)
T2(NEWT2ID)->T3(ID)
由于在9i中sys_connect_by_path函数不能处理有循环对记录集,故本例子只适合不会循环关联的表(如引用自身表的外键)
10g中sys_connect_by_path加入了对循环情况对处理,等手头有了10g环境再测试一下
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/231499/viewspace-63709/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/231499/viewspace-63709/