oracle – 表依靠的递归查询不会像我想的那样递归
我有一个设法,我可以编写一个查询来查找根表的全部儿女表,基于外键. 查询看起来像这样: select level,lpad(' ',2 * (level - 1)) || uc.table_name as "TABLE",uc.constraint_name,uc.r_constraint_name from all_constraints uc where uc.constraint_type in ('R','P') start with uc.table_name = 'ROOT_TAB' connect by nocycle prior uc.constraint_name = uc.r_constraint_name order by level asc; 功效我看起来像这样: 1 ROOT_TAB XPKROOTTAB 1 ROOT_TAB R_20 XPKPART_TAB 2 CHILD_TAB_1 R_40 XPKROOTTAB 2 CHILD_TAB_2 R_115 XPKROOTTAB 2 CHILD_TAB_3 R_50 XPKROOTTAB 此功效是ROOT_TAB的全部子表,但查询不会递归到CHILD_TAB_1,CHILD_TAB_2或CHILD_TAB_3的子项. 递归查询对我来说是新的,以是我猜我在connect by子句中穷乏一些对象,但我在这里画一个空缺.现实上是否可以在单个查询中得到ROOT_TAB的完备条理布局,可能我最亏得递归进程中包装查询? 办理要领你想要这样的对象:select t.table_name,level,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 原始查询的题目是子表的uc.constraint_name是外键的名称.这对付将第一个子节点毗连到根表是很好的,可是不必要将第二个节点上的子节点毗连到第一个节点.这就是为什么你必要毗连两次束缚 – 一次获取表的主键,一次获取外键. 趁便说一句,假如您要查询all_ *视图而不是user_ *视图,凡是必要将它们毗连到table_name AND owner,而不只仅是table_name.假如多个模式具有沟通名称的表,则仅插手table_name将获得不正确的功效. (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |