oracle表分层,sql – 对非分层数据的Oracle分层查询

我将一个Oracle表中的数据组织成可以包含循环的图(参见示例).

CREATE TABLE T (parent INTEGER,child INTEGER)

AS select 1 parent,2 child from dual

union all select 1 parent,8 child from dual

union all select 2 parent,3 child from dual

union all select 2 parent,4 child from dual

union all select 2 parent,8 child from dual

union all select 3 parent,4 child from dual

union all select 3 parent,6 child from dual

union all select 4 parent,5 child from dual

union all select 5 parent,8 child from dual

union all select 6 parent,5 child from dual

union all select 7 parent,3 child from dual

union all select 7 parent,5 child from dual

union all select 8 parent,6 child from dual

我的目标是获得节点X的所有后代(孩子,孩子的孩子等)的节点.假设2.我的预期结果是:3,4,5,6,8.

我知道我可以设计一个这样的查询:

SELECT child,sys_connect_by_path(child,'/')

FROM T

START WITH parent = 2

CONNECT BY NOCYCLE PRIOR child = PARENT;

这样一个查询的问题是,它会遍历所有可能的路径,直到它们循环,并且在我的实际数据中有太多的路径.结果包括许多重复 – 这里是:

child | sys_connect_by_path (for information)

3 | /3

4 | /3/4

5 | /3/4/5

8 | /3/4/5/8

6 | /3/4/5/8/6

6 | /3/6

5 | /3/6/5

8 | /3/6/5/8

4 | /4

5 | /4/5

8 | /4/5/8

6 | /4/5/8/6

8 | /8

6 | /8/6

5 | /8/6/5

我的实际数据要复杂得多.这样的查询的执行成本是如此巨大,使得我的TEMP表空间(可自动扩展)达到10Gb(最初为500Mb),并且由于磁盘已满,我的数据库实际上被破坏.

我试图设计这样的查询(递归WITH子句):

WITH descendants(node) AS

( SELECT 2 node FROM dual

UNION ALL

(

SELECT child

FROM T

INNER JOIN descendants D

ON T.parent = D.node

MINUS SELECT node FROM descendants

)

)

SELECT * FROM descendants

我遇到的问题是:

>使用Oracle 10g,这没有实现(ORA-32033:不支持的列别名,一些客户使用Oracle 9或10)

>使用Oracle 11g,我得到ORA-32041:递归WITH子句中的UNION ALL操作必须只有两个分支.如果我删除了MINUS子句,我将获得循环(ORA-32044:在执行递归WITH查询时检测到循环).

您如何查询我的原始数据以有效地获得这些节点3,8? PL / sql解决方案也受到欢迎.

谢谢.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值