2013-07-11 36 views
2

我有一個表格(讓我們把它命名爲HEIRARCHY_TABLE)以這種格式表示分層數據,其中樹以這種格式存儲。需要來自heirarchial表的denormalized查詢

HEIRARCHY_TABLE (parent_name ,parent_id  ,child_name ,child_id) 
Sample Data in HEIRARCHY_TABLE:- 
------------------------------------------- 
parent_name |parent_id  |child_name |child_id 
-------------------------------------------- 
parent_1 | parent_1_id | leaf_node | leaf_node_id1 

parent_2 | parent_2_id | parent_1 | parent_1_id 

上述場景是示出用於數據的情況下,其中parent_2-> parent_1-> leaf_node 其中 - >表示「是父」關係船。

我需要查詢此表,並獲得像這樣的結果所有葉節點。 結果: -

leaf_node | parent_1 | parent_2 | parent_3 | parent_4 | parent_5 | parent_6 | parent_7

如果假設葉節點只有兩個父母,那麼我需要其餘的父值爲null。即,如果它只有5個父母,那麼parent_6和parent_7應該爲空。 注意: - 上表包含多個樹。它包含多個根。我需要以此格式在此表中可用的所有樹的數據。所有樹中的最大級別僅爲7。

+0

您正在尋找甲骨文? – Taylor

+0

是的,我正在尋找一個的Oracle SQL查詢 – Dilip

回答

0

最快的查詢將是使用heirarchy IDs。那麼您可以使用heirarchy id列上的CONTAINS對全部或部分樹進行查詢。

當然這假定你被允許/可以建立這個列。

對於oracle,您可以執行Heirarchy Query。不確定其效率/非標準化因素。 http://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm

+0

正如你建議我,我已經嘗試此SQL查詢: - 選擇PARENT_NAME, PARENT_ID, child_id, CHILD_NAME, LEVEL, SYS_CONNECT_BY_PATH(CHILD_NAME, '/')「路徑」 FROM fusion_role_heirarchies一個 WHERE不存在(來自fusion_role_heirarchies b。選擇所需1其中b.parent_name = a.child_role) CONNECT BY PRIOR child_id = PARENT_ID ORDER SIBLINGS BY CHILD_NAME; 但是,這是所有記錄(葉,非葉節點)返回。我想這隻適用於非葉節點。 – Dilip

+0

感謝一噸爲您及時help.I有CONNECT_BY_ISLEAF – Dilip

0

谷歌周圍的公用表表達式。我認爲你在尋找的是一個遞歸查詢。您將不得不玩一些遊戲來強制查詢爲實際不存在的父母返回空值。 [檢查此。](http://www.morganslibrary.org/reference/with.html

+0

做到了我試圖用這個SQL,你建議我: - SELECT COUNT(*)FROM 一個HEIRARCHY_TABLE, HEIRARCHY_TABLE B, HEIRARCHY_TABLE C, HEIRARCHY_TABLE d, HEIRARCHY_TABLE E, HEIRARCHY_TABLE樓 HEIRARCHY_TABLE克 WHERE b.child_id = a.parent_id AND c.child_id(+)= b.parent_id AND d.child_id(+)= c.parent_id 以及e。 child_id(+)= d.parent_id AND f.child_id(+)= e.parent_id AND g.child_id(+)= f.pare nt_id; 這是乘以現有數據。如果我有100個奇數記錄。這個SQL給了我2000個奇數記錄。可以請你幫我在哪裏我錯了 – Dilip

+0

謝謝你的幫助。 – Dilip