程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> oracle高級SQL(三)--遞歸查詢,oraclesql--遞歸

oracle高級SQL(三)--遞歸查詢,oraclesql--遞歸

編輯:Oracle教程

oracle高級SQL(三)--遞歸查詢,oraclesql--遞歸


oracle中有connect by子句。是用於層次查詢。就是遞歸查詢。 其中語法如下:
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

本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接.

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved