在層次查詢中,如果想讓“
親兄弟”按規矩進行升序
排序就不得不借助
ORDERSIBLINGS BY這個特定的排序語句,若要降序輸出可以在其后添加DESC關鍵字。
通過這個
實驗給大家展示一下這個“親兄弟”間的排序功能。
1.回望關系“樹”,這棵樹中的B和C是親兄弟,F和G是親兄弟。注意,D和E不是親兄弟,最多也就算是堂兄弟,“親兄弟排序”功能對他們無效。
A
/ \
B C
/ /
D E
/ \
F G
2.重溫一下闡述上圖的T表數據
sec@ora10g> select * from t;
X Y Z
---------- ---------- ----------
A 1
B 2 1
C 3 1
D 4 2
E 5 3
F 6 4
G 7 4
7 rows selected.
3.我們對X列使用“ORDER SIBLINGS BY”進行升序排序,重點關注B和C、F和G的順序。
sec@ora10g> select lpad(' ',level-1)||x tree, SYS_CONNECT_BY_PATH(x,'/') tree_path from t start with x = 'A' connect by prior y=z order siblings by x;
TREE TREE_PATH
---------------- ----------------
A /A
B /A/B
D /A/B/D
F /A/B/D/F
G /A/B/D/G
C /A/C
E /A/C/E
7 rows selected.
4.我們對X列使用“ORDER SIBLINGS BY DESC”進行降序排序,重點關注B和C、F和G的順序。
sec@ora10g> select lpad(' ',level-1)||x tree, SYS_CONNECT_BY_PATH(x,'/') tree_path from t start with x = 'A' connect by prior y=z order siblings by x desc;
TREE TREE_PATH
---------------- ----------------
A /A
C /A/C
E /A/C/E
B /A/B
D /A/B/D
G /A/B/D/G
F /A/B/D/F
7 rows selected.
5.如在層次查詢中錯誤的使用了“ORDER BY”進行排序,則層次查詢中蘊含的遍歷順序將被打亂,剩下的將只是信息的羅列。
sec@ora10g> select lpad(' ',level-1)||x tree, SYS_CONNECT_BY_PATH(x,'/') tree_path from t start with x = 'A' connect by prior y=z order by x;
TREE TREE_PATH
---------------- ----------------
A /A
B /A/B
C /A/C
D /A/B/D
E /A/C/E
F /A/B/D/F
G /A/B/D/G
7 rows selected.
6.小結
具體問題具體分析,特殊場合特出方法。在層次查詢中如需對親兄弟的先后順序進行限定,就必須要使用特有的“ORDER SIBLINGS BY”而非“ORDER BY”子句。切記之。