加入在Oracle树查询其他表(Joining other tables in oracle tre

2019-07-30 17:19发布

给出一个简单的(ID,说明)表t1,如

id  description
--  -----------
1   Alice
2   Bob
3   Carol
4   David
5   Erica
6   Fred

和父子关系表T2,如

parent  child
------  -----
1       2
1       3
4       5
5       6

Oracle提供了遍历这个与一些自定义的语法扩展树的方法:

select parent, child, sys_connect_by_path(child, '/') as "path"
from t2
connect by prior parent = child

确切的语法并不重要,我可能已经在上面犯了一个错误。 重要的是,上面会产生一种看起来像

parent  child  path
------  -----  ----
1       2      /1/2
1       3      /1/3
4       5      /4/5
4       6      /4/5/6
5       6      /5/6

我的问题是:是否有可能加入SYS_CONNECT_BY_PATH内的另一个表(),如上述T1表,产生类似:

parent  child  path
------  -----  ----
1       2      /Alice/Bob
1       3      /Alice/Carol
... and so on...

Answer 1:

在您的查询,与连接T1和T2,然后返回父母,孩子和孩子的描述子查询替换T2。 然后在SYS_CONNECT_BY_PATH功能,从你的子查询中引用的孩子描述。



Answer 2:

基于迈克·麦卡利斯特的想法,下面使用派生表,以达到预期的效果:

select
     T.PARENT
    ,T.CHILD
    ,sys_connect_by_path(T.CDESC, '/')
from
    (
        select
             t2.parent      as PARENT
            ,t2.child       as CHILD
            ,t1.description as CDESC
        from
             t1, t2
        where
            t2.child = t1.id
    ) T
where
    level > 1 and connect_by_isleaf = 1
connect by prior
    T.CHILD = T.PARENT

在我的问题,所有的家长都在“超级父母”根锚定,这意味着该路径可以与SYS_CONNECT_BY_PATH充分说明,从而避免了与路径串联父cagcowboy的技术的需求。



Answer 3:

SELECT parent, child, parents.description||sys_connect_by_path(childs.description, '/') AS "path"
FROM   T1 parents, T1 childs, T2
WHERE  T2.parent = parents.id
AND    T2.child = childs.id
CONNECT BY PRIOR parent = child


文章来源: Joining other tables in oracle tree queries