2014-01-06 75 views
2

我在Oracle DB中有两个表:项目和关系。Oracle,选择关系

项目:

ID 
--- 
1 
2 
3 
4 
5 
6 
7 

关系:

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

在关系表中,我存储的“项目”的分级结构(不要问为什么它存储在不同的表) 。

问题:

当我执行此查询:

SELECT PARENT_ID, CHILD_ID, CONNECT_BY_ISLEAF, MAX(LEVEL) OVER() + 1 - LEVEL as rev_level 
    FROM relationship 
CONNECT BY PRIOR PARENT_ID = CHILD_ID 
    START WITH CHILD_ID = 7; 

我没有看到根父,因为他并不在此表中存在作为一个孩子。

问题是如何将根父(ID = 1)添加到查询结果或将它连接到“items”表并保留结果列(level和isleaf)。

回答

0
  1. CONNECT_BY_ISLEAF采用自下而上搜索时,周围工作的其他方式(请参阅此链接http://technology.amis.nl/2009/11/14/oracle-11gr2-alternative-for-connect_by_isleaf-function-for-recursive-subquery-factoring-dedicated-to-anton/
  2. 我假设你想显示更多有关该项目的数据(如名称)如果是这种情况,只需要将项目表加入即可。

    SELECT PARENT_ID AS PARENT_ID,CHILD_ID, i.name AS CHILD_NAME, 
         CONNECT_BY_ISLEAF, 
         MAX(LEVEL) OVER() + 1 - LEVEL AS rev_level 
        FROM items i 
        LEFT JOIN relationship r ON (i.id = r.CHILD_ID) 
    CONNECT BY PRIOR PARENT_ID = CHILD_ID 
        START WITH CHILD_ID = 7 
    ORDER BY REV_LEVEL; 
    

检查这个SQLfiddle:http://sqlfiddle.com/#!4/5c9fa/17 另外检查这个岗位约自下而上搜索(http://bitbach.wordpress.com/2010/10/18/implementing-bottom-up-path-traversal-for-hierarchical-tables/

+0

谢谢,但我没有这个行值(10,空,1) – user3164429

+0

我将连接条件更改为(i.id = r.CHILD_ID或i.id = r.PARENT_ID),但现在我需要将连接条件分组或添加DISTINCT – user3164429

0

请注意,您有两个方向 - 父母和子女。 挑一个,不要混合这两个。

1 with x as (
    2  select 1 as id, 1 as parent, 2 as child from dual union all 
    3  select 2,   1   , 3 from dual union all 
    4  select 3   ,1,   4 from dual union all 
    5  select 4   ,2,   5 from dual union all 
    6  select 5   ,2,   6 from dual union all 
    7  select 6   ,3,   7 from dual) 
    8 select * 
    9 from  x 
10 sTART WITH child = 7 
11* CONNECT BY PRIOR id= CHILD 
SQL>/

     ID  PARENT  CHILD 
---------- ---------- ---------- 
     6   3   7 
     5   2   6 
     4   2   5 
     3   1   4 
     2   1   3 
     1   1   2 

连接是通过prior id = child制成,不prior parent = child