2013-02-27 12 views
2
achive特別分層查詢

我有一個表,看起來像(11.2.0.2.0甲骨文):如何在Oracle

ParentID ID  AllowsEntry 
NULL  A188  N 
A188  1881  Y 
NULL  A189  N 
A189  1891  Y 
1891  189A  Y 

業務規則允許非葉級元素有數據錄入,但我需要提出報告,如果他們沒有我需要能夠查詢產生類似的輸出數據庫:

ParentID ID 
NULL  A188 
A188  1881 
NULL  A189 
A189  1891_ 
1891_  189A 

所以基本上我需要按下中間的分支,讓數據輸入到葉級。新葉需要捲起重命名分支:

Old Tree  New Tree 
A188   A188   -- remains the same, no data entry at this level 
    1881   1881  -- remains the same, data entry allowed at leaf 
A189   A189   -- remains the same, no data entry at this level 
    1891   1891_  -- this is the level that is wrong 
    189A   1891  -- 1891 is push down into a new 1891_ level 
        189A  -- and rolls up into the new level. 
        189B  -- etc. 

感謝您的幫助

+0

哪裏'189B'從何而來? – 2013-02-27 13:58:37

+0

父級分支級別和最低級別級別都有更多值。這是一個簡單的例子。 – tayknight 2013-02-27 16:47:49

+0

您的示例在第一個查詢和最後一個查詢之間不一致。很難理解你現在的期望。 – 2013-02-27 17:03:55

回答

0

我想你想的葉元素添加到具有AllowsEnrtry = 'Y'節點。節點元素也應該用尾部下劃線重新命名。

您可以模擬與UNION ALL修改的數據,並在此視圖下執行遞歸查詢:

SQL> WITH DATA AS (
    2  SELECT NULL parentid, 'A188' ID, 'N' allowsEntry FROM dual 
    3  UNION ALL SELECT 'A188', '1881', 'Y' FROM dual 
    4  UNION ALL SELECT NULL , 'A189', 'N' FROM dual 
    5  UNION ALL SELECT 'A189', '1891', 'Y' FROM dual 
    6  UNION ALL SELECT '1891', '189A', 'Y' FROM dual 
    7  UNION ALL SELECT '1891', '189B', 'Y' FROM dual 
    8 ), leaf_also_nodes AS (
    9  SELECT * 
10  FROM DATA 
11  WHERE allowsEntry = 'Y' 
12  AND ID IN (SELECT parentid FROM DATA) 
13 ), data_plus AS (
14  SELECT d.parentid, 
15   d.id, 
16   CASE WHEN l.id IS NOT NULL THEN l.id || '_' ELSE d.id 
17   END display_name 
18  FROM DATA d 
19  LEFT JOIN leaf_also_nodes l ON d.id = l.id 
20  UNION ALL 
21  SELECT ID, NULL, ID FROM leaf_also_nodes 
22 ) 
23 SELECT rpad(' ', (LEVEL - 1) * 2, ' ') || display_name tree 
24 FROM data_plus 
25 START WITH parentid IS NULL 
26 CONNECT BY (PRIOR ID = parentid); 

TREE 
----------------------------------------- 
A188 
    1881 
A189 
    1891_ 
    189A 
    189B 
    1891 
+0

這很酷,而且完美。是否有可能通過select語句編寫connect,以便它返回parentid和id以及新的父分支的尾部下劃線? (請在我原來的問題中看到第二個選擇語句,帶有下劃線的語句)。 謝謝。 – tayknight 2013-02-27 18:57:28

+0

當然,添加'PRIOR display_name'列以獲得修改後的'parentid'。 – 2013-02-28 08:44:54

+0

啊。這很酷。我沒有意識到你可以在select語句中使用PRIOR關鍵字。 – tayknight 2013-02-28 14:45:56