2009-09-18 43 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