2014-12-28 25 views
1

下表考慮甲骨文確定等級關係,但在反向

sortOrder   thisID    levelNo 
------------------- ------------------- --------------------- 
1     A     0 
2     B     1 
3     C     1 
4     D     2 
5     E     3 
6     F     3 
7     G     1 
8     H     0 
9     I     1 

這可能是視覺視爲

A 
B 
C 
    D 
    E 
    F 
G 
H 
I 

我怎麼能確定孩子父母的關係,以低於輸出以下?該關係基於sortOrder和levelNo。

thisID    parentID 
------------------- --------------------- 
A     A 
B     A 
C     A 
D     C 
E     D 
F     D 
G     A 
H     H 
I     H 

我熟悉使用查詢來確定基於層次父 - 子關係的級別,但還沒有找到一種方法來做到相反。

+0

孩子=父母+ 1?非常不清楚..請添加更多細節..怎麼來G-> A !! –

+0

第一個表似乎顯示層次結構中的級別;但是,它不顯示哪個孩子與哪個父母相關。你能向我們解釋表1背後的邏輯嗎? –

+0

此外,關係似乎取決於表中的位置;但是,表格中沒有自然的行數。如果查詢不包含ORDER BY子句,Oracle可以決定以任何順序返回行。 –

回答

1

請嘗試

SELECT 
    T.thisID 
    , CASE T.levelNo 
    WHEN 0 
     THEN T.thisID 
    ELSE (
      SELECT thisID FROM Table1 
      WHERE sortOrder = (
           SELECT MAX(sortOrder) FROM Table1 
           WHERE (levelNo = T.levelNo - 1) 
           AND sortOrder < T.sortOrder 
          ) 
     ) 
    END parent 
FROM Table1 T 
ORDER BY sortOrder; 

看到它在行動:SQL Fiddle

如果需要進一步的細節/調整,請發表評論。

+0

聰明的一個..! +1 –

+0

這很好,但掛在非常大的記錄集上。你對如何優化它有什麼想法嗎? – username

+0

在這種情況下,「非常大」是什麼? 「levelNo」和「sortOrder」的指數是否到位?該樹是否相當高(「levelNo」的值高)還是寬?這只是一次性工作嗎?哪個版本的Oracle? – Abecee