2012-11-09 40 views
1

我需要獲得給定節點的子節點以及屬於其最高祖先的字段。我知道如何單獨獲得兩者,而且我可能會弄清楚如何以編程方式將兩者結合起來;但我更願意在一個查詢中完成所有操作。Oracle - 同時獲得兒童和祖父母

假設我的表包含字段ID,ITEM_ID,代碼和名稱,以及爲0的ITEM_ID是根節點,那我的樹看起來像:

id item_id code  name level 
------------------------------------ 
1 0     Root 1 
2 1  my_value Child1 2 
3 2     Child2 3 

我能得到的節點我需要使用:

select id, item_id, code, name, level from my_table 
start with code like '%my_value%' 
connect by prior id = item_id 

返回:

id item_id code  name level 
------------------------------------- 
2 1  my_value Child1 2 
3 2     Child2 3 

我想也高得名稱字段est這些節點的祖先。我可以用得到這些節點:

select id, item_id, code, name, level from my_table 
where level = (
    select max(level) as max_level from my_table 
    start with code like '%my_value%' 
    connect by prior item_id = id 
) 
start with code like '%my_value%' 
connect by prior item_id = id 

返回:

id item_id code  name level 
------------------------------------- 
1 0     Root 1 

我想添加的名稱字段從上面的查詢返回一個附加字段添加到兩個節點從返回第一個查詢,即

id item_id code  name root_name level 
------------------------------------------------ 
2 1  my_value Child1 Root  2 
3 2     Child2 Root  3 

我希望這很清楚。有什麼建議麼?

回答

2

也許從根開始,然後過濾以限制以像my_value這樣的代碼開始?

SQL> select id, item_id, code, name, lvl, root_name 
    2 from (select id, item_id, code, name, level lvl, sys_connect_by_path(code, '|') c, 
    3    connect_by_root name as root_name 
    4    from my_table 
    5   start with item_id = 0 
    6   connect by prior id = item_id) 
    7 where c like '%my_value%'; 

     ID ITEM_ID CODE     NAME    LVL ROOT_NAME 
---------- ---------- -------------------- ---------- ---------- ---------- 
     2   1 my_value    Child1    2 Root 
     3   2      Child2    3 Root 
+0

這絕對是完美的,謝謝!有時間在sys_connect_by_path和connect_by_root上進行讀取! – earachefl