SELECT ... FROM <TABLENAME> WHERE <CONDITIONAL-1> START WITH <CONDITIONAL-2> CONNECT BY <CONDITIONAL-3>注解: 1. CONDITIONAL-1條件:即SQL中的過濾條件,
2.CONDITIONAL-2條件:是根結點的限定語句;是從哪個條件開始。
3. CONDITIONAL-3條件:是連接條件;即按照什麼條件去遞歸查詢 注意其中兩個關鍵字PRIOR;LEVEL至於它們的作用;我們用下面一個例句來理解
SQL> select * from li0924; ROOT_ID ID NAME ---------- ---------- ---------- 0 1 namei --最近在看海賊王;借用下名字 1 2 lufei 1 3 shanzhi 0 4 qiaoba 3 5 suolong 4 6 luobin 6 rows selected. SQL> SELECT root_id,PRIOR ID,ID,NAME,LEVEL FROM i0924 2 START WITH root_id = 0 3 CONNECT BY root_id = PRIOR ID; --注意root_id和prior id這兩列。其中level可以看作是深度 ROOT_ID PRIORID ID NAME LEVEL ---------- ---------- ---------- ---------- ---------- 0 1 namei 1 1 1 2 lufei 2 1 1 3 shanzhi 2 3 3 5 suolong 3 0 4 qiaoba 1 4 4 6 luobin 2 6 rows selected.
作用:
【1】生成序列 產生一個1-10列表。 類似liunx命令中seq 10。當然像postgresql數據庫,其中用序列函數。generate_series(1, 10)。oracle中是沒有這個函數的。但是我們可以借用connect by子句。SQL> SELECT LEVEL FROM dual CONNECT BY LEVEL <= 10; LEVEL ---------- 1 2 3 4 5 6 7 8 9 10 10 rows selected.
【2】分割字符串
先看這一例,26樓的函數。 http://www.itpub.net/thread-1895923-3-4.html 分割字符串;這部分內容我想等到下一章節再說; 【3】oracle的進制轉換 我的博客3篇 --36,16,8進制轉換為10進制的函數。 【4】主要函數 其實就是我們常用的;借用上面那個表。SELECT CONNECT_BY_ROOT NAME "ROOT" , 2 CONNECT_BY_ISLEAF "ISLEAF", 3 SYS_CONNECT_BY_PATH(NAME, '/') AS PATH 4 FROM li0924 5 START WITH root_id = 0 6 CONNECT BY root_id = PRIOR ID; ROOT ISLEAF PATH -------------------------------------------------------------------------------- namei 0 /namei namei 1 /namei/lufei namei 0 /namei/shanzhi namei 1 /namei/shanzhi/suolong qiaoba 0 /qiaoba qiaoba 1 /qiaoba/luobin 6 rows selected.
說說這CONNECT_BY_ROOT,CONNECT_BY_ISLEAF,SYS_CONNECT_BY_PATH,這三個函數的意義
CONNECT_BY_ROOT: 返回當前節點的最頂端節點 CONNECT_BY_ISLEAF: 判斷是否為葉子節點,如果有則返回0;沒有返回1 SYS_CONNECT_BY_PATH:函數顯示詳細路徑,並用“/”分隔.其中這個分隔符可以替換。
作者 : li0924
時間 : 2014-11-20
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接.