賽迪網 > IT技術 數據庫 > 精彩更新
  IT資訊搜索
 
IT產品搜索

在Oracle層次查詢中給SIBLINGS排序

發佈時間:2007.01.26 04:45     來源:builder.com.cn    作者:Bob Watkins





Oracle SELECT語句中的START WITH和CONNECT BY子句自動阻斷一個層次。缺少這項特性,就需要一個複雜的自聯接來確定行之間的邏輯聯繫。START WITH子句指定被認為是層次起點,或“根”的一行或幾行。然後CONNECT BY PRIOR子句指明哪些行彼此關聯。

例如,列表A中的查詢從Oracle HR樣本模式的EMPLOYEES表中生成一個“Reports To”列表。

column "Reports To" format a30
set pagesize 9999

SELECT LPAD(' ', 2*(LEVEL-1))||last_name "Reports To", employee_id
FROM employees
START WITH employee_id IN (101, 102)
CONNECT BY PRIOR employee_id = manager_id
/

列表A

LEVEL偽列表明報告當前嵌套的深度,這裡我使用LPAD僱員姓名對它們進行縮排。START WITH條件指出只有僱員101和102被認為是起點。然後CONNECT BY PRIOR子句將一行中的employee_id列與另一行的manager_id列連接起來,指出誰向誰報告。

如果你在HR模式中運行這個查詢,你會注意到某個經理列表中的姓沒有分類,它們以Oracle在處理層次時遇到它們的順序排列。

如果你希望下屬以字母順序排列,你可以嘗試對原始的last_name列使用ORDER BY。但是,這樣會破壞層次,把它變回一個單調的姓名列表。

你還可以首先對偽列LEVEL使用ORDER BY,它說明某個特殊行在層次中的深度。這同樣也會破壞層次,首先會列出所有的經理,然後是向他們報告的僱員。

在Oracle 10g(兩個版本)中,現在很容易實現這一點:你可以使用新的SIBLINGS關鍵字建立正確的順序。其語法如下:

ORDER SIBLINGS BY <expression>

因此在查詢結尾處增加下面這個子句:

ORDER SIBLINGS BY last_name

將會保護層次,並在每個等級中以字母順序排列僱員的姓。注意最初的last_name用作“Reports To”的別名。“Reports To”中的額外空間會影響排序,因此必須使用最初的last_name。列表B中是增加ORDER SIBLINGS BY前後的輸出結果。

SQL> @siblings_without_orderby

Reports To                     EMPLOYEE_ID                                      
------------------------------ -----------                                      
Kochhar                                101                                      
  Whalen                               200                                      
  Mavris                               203                                      
  Baer                                 204                                      
  Higgins                              205                                      
    Gietz                              206                                      
  Greenberg                            108                                      
    Faviet                             109                                      
    Chen                               110                                      
    Sciarra                            111                                      
    Urman                              112                                      
    Popp                               113                                      
De Haan                                102                                      
  Hunold                               103                                      
    Ernst                              104                                      
    Austin                             105                                      
    Pataballa                          106                                      
    Lorentz                            107                                      

18 rows selected.

SQL> @siblings_with_orderby

Reports To                     EMPLOYEE_ID                                      
------------------------------ -----------                                      
De Haan                                102                                      
  Hunold                               103                                      
    Austin                             105                                      
    Ernst                              104                                      
    Lorentz                            107                                      
    Pataballa                          106                                      
Kochhar                                101                                      
  Baer                                 204                                      
  Greenberg                            108                                      
    Chen                               110                                      
    Faviet                             109                                      
    Popp                               113                                      
    Sciarra                            111                                      
    Urman                              112                                      
  Higgins                              205                                      
    Gietz                              206                                      
  Mavris                               203                                      
  Whalen                               200                                      

18 rows selected.

SQL>

列表B

(T004)


[ 發表評論 ] 字體[  ] [ 列印 ] [ 進入博客 ] [ 進入論壇 ]  [ 推薦給朋友 ]
  相關文章
· Oracle 10g自動工作負載資訊庫剖析 (01-25) · 甲骨文新推Oracle Linux管理套裝軟體 (01-25)
· 防患于未然 給Oracle數據庫打補丁 (01-25) · Oracle的CRM武器--讓數據圍著銀行轉 (01-24)
· SQL Server和Oracle數據鎖定比較 (01-24) · Oracle基於Client/Server的性能調整 (01-24)
· Linux平台下監控Oracle數據庫性能 (01-24) · Oracle中PL/SQL編程對系統性能的影響 (01-24)
· 專家調優秘密之改善Oracle數據庫性能 (01-24) · 在數據字典中直接修改Oracle表列名 (01-23)
  客戶需求反饋表
* 姓  名:
更多資料  了解方案  認識廠商
* 單位名稱:
* 聯繫電話:
* 電子郵件:
  賽迪推薦  
  手機·資費 ·新品·導購·評測·手機資費·寬帶
手機搜索  諾基亞 N73 MOTO Z6
  IT產品 ·筆記本·臺式機·伺服器·列印·投影
IT產品搜索 
  IT技術 ·開發·網管·安全·數據庫·作業系統
  博客·論壇 ·曾劍秋·項立剛·Java學習·網管