2009-09-18 46 views
5

我在Oracle 9i数据库表的父子关系的Oracle 9i中得到树的最高成员与给孩子

,如:

parent | child 
1  | 2 
2  | 3 
2  | 4 
null | 1 
1  | 8 

我需要从一个给定的得到绝对父儿童。 说,我有孩子4,它必须给我的父母:1

我已经看过CONNECT BY,但我找不到解决方案。

+0

所以,你想要的最终母公司,不是所有的联系? – 2009-09-18 14:26:27

+0

是的,没错。 我现在没有在运行时有多少级别。 – jwdehaan 2009-09-24 21:47:51

回答

4

您可以使用CONNECT BY查询来建立家长的名单,然后进行过滤:

SQL> WITH tree AS (
    2  SELECT 1 parent_id, 2 child_id FROM DUAL 
    3  UNION ALL SELECT 2 , 3 FROM DUAL 
    4  UNION ALL SELECT 2 , 4 FROM DUAL 
    5  UNION ALL SELECT null, 1 FROM DUAL 
    6  UNION ALL SELECT 1 , 8 FROM DUAL 
    7 ) 
    8 SELECT child_id 
    9 FROM (SELECT * 
10   FROM tree 
11   CONNECT BY PRIOR parent_id = child_id 
12   START WITH child_id = 4) 
13 WHERE parent_id IS NULL; 

    CHILD_ID 
---------- 
     1 
0
SELECT parent 
FROM (
     SELECT parent 
     FROM (
       SELECT parent, level AS l 
       FROM mytable 
       START WITH 
         child = 4 
       CONNECT BY 
         child = PRIOR parent 
       ) 
     ORDER BY 
       l DESC 
     ) 
WHERE rownum = 1 

这会给你NULL作为绝对父母。

如果你想1,与child替换parent

SELECT child 
FROM (
     SELECT child 
     FROM (
       SELECT child, level AS l 
       FROM mytable 
       START WITH 
         child = 4 
       CONNECT BY 
         child = PRIOR parent 
       ) 
     ORDER BY 
       l DESC 
     ) 
WHERE rownum = 1 
+0

我需要绝对的父级,没有预定义的级别数量。 – jwdehaan 2009-09-25 14:03:52

+0

该查询给出了绝对父项(本例为“NULL”)。如果你想'1',只需在上面的查询中用'child'替换'parent'。 – Quassnoi 2009-09-25 14:16:15