2012-11-20 16 views
0

我們有一個Oracle自我引用表來表示層次結構類似於:當結果集來自自引用表時,是否有按層次結構進行排序的方法?

THING 
--------- 
ID 
PARENT_ID 
NAME 
SOME_DATA 

頂級THINGnullPARENT_ID

我希望能夠從該表中選擇,並通過每行的層次結構中(從上到下)位置爲了我的數據,然後通過名稱,該數據集:

ID PARENT_ID NAME SOME_DATA 
1  null top  null 
2   1 cat  null 
3   1 dog  null 
4   2 frog  null 
5   1 bird  null 
6   2 fish  null 

...變爲:

ID PARENT_ID NAME SOME_DATA 
1  null top  null 
5   1 bird  null 
2   1 cat  null 
6   2 fish  null 
4   2 frog  null 
3   1 dog  null 

當我開始打字這個問題,我很好奇任何不論是否有辦法做到這一點不添加LEVEL列表,但現在我甚至確定可以通過添加該列來完成。

「不」的答案在這裏完全可以接受,因爲我已經辭職了,我必須在我的Java代碼中這樣做。

回答

2

而不是使用LEVEL並試圖管理一個聰明的方法的結果,有可能使用START WITHORDER SIBLINGS BY讓你正在尋找的結果是:

SQL Fiddle

SELECT t.* 
FROM thing t 
CONNECT BY PRIOR t.id = t.parent_id 
START WITH t.parent_id IS NULL 
ORDER SIBLINGS BY t.name 

Results

| ID | PARENT_ID | NAME | SOME_DATA | 
------------------------------------- 
| 1 | (null) | top | (null) | 
| 5 |   1 | bird | (null) | 
| 2 |   1 | cat | (null) | 
| 6 |   2 | fish | (null) | 
| 4 |   2 | frog | (null) | 
| 3 |   1 | dog | (null) | 

通過層次結構進行鏈接,從根(parent_id IS NULL)開始並命令結果。

+0

哇。謝謝。這是一些嚴重的Oracle Jedi的東西。 –

+0

不客氣! – Ben

相關問題