Oracel中Start with 用法(轉)

一,基本語法

SELECT ... FROM    + 表名 
START WITH         + 條件1
CONNECT BY PRIOR   + 條件2
WHERE              + 條件3

條件1:是根節點的限定語句,當然可以放寬限定條件,以取得多個根節點,也就是多棵樹;在連接關係中,除了可以使用列明外,還允許使用列表達式。
START WITH 子句爲可選項,用來標識哪個節點作爲查找樹形結構的根節點。若該子句省略,則表示所有滿足查詢條件的行作爲根節點。
條件2:是連接條件,其中用PRIOR表示上一條記錄,例如CONNECT BY PRIOR STUDENT_ID = GRADE_ID,意思就是上一條記錄的STUDENT_ID是本條記錄
的GRADE_ID,即本記錄的父親是上一條記錄。CONNECT BY子句說明每行數據將是按照層次順序檢索,並規定將表中的數據連入樹形結構的關係中。
PRIOR運算符必須放置在連接關係的2列中某一個的前面。對於節點間的父子關係,PRIOR運算符在一側表示父節點,在另一側表示子節點,從而確定查
找樹結構的順序是自頂向下,還是自底向上。
條件3:是過濾條件,用於對返回的記錄進行過濾。

1,定義查找起始節點
    在自頂向下查詢樹狀結構時,不但可以從根節點開始,還可以定義任何節點爲起始節點,以此開始,向下查找。這樣查找的結果就是以該節點爲開始
的結構是樹的一枝。

看一個例子:
SELECT * FROM STUDENT 
START WITH STUDENT_ID = '00001'
CONNECT BY PRIOR STUDENT_ID = GRADE_ID;

1,CONNECT BY PRIOR是結構化查詢中用到的;
2,START WITH... CONNECT BY PRIOR...的作用,簡單來說,就是將一個樹狀結構存儲在一張表裏。

    假如一個表裏存在2個字段:STUDENT_ID(學生ID)、GRADE_ID(班級ID),那麼我們可以通過表示每一個學生屬於哪一個班級,來形成一個樹狀
結構,通過START WITH... CONNECT BY PRIOR...語法,就可以取得這棵樹的所有記錄。

--自頂向下 以BRH_ID = '0003'這個節點爲根節點,向下查詢
SELECT * FROM IM_BRANCH 
START WITH BRH_ID = '0003'
CONNECT BY PRIOR BRH_ID = BRH_PARENTID

--自底向上 以BRH_ID = '0003'這個節點爲葉節點,向上查詢
SELECT * FROM IM_BRANCH 
START WITH BRH_ID = '0003'
CONNECT BY BRH_ID = PRIOR BRH_PARENTID

二,應用場景

    START WITH... CONNECT BY PRIOR...常見的用法,是用來遍歷含有父子關係的表結構中。比如省市關係,一個省
下面包含多個城市,如果城市基本信息表中,包含有屬於哪個省級的字段,那麼如果要遍歷所有的城市,我們就可以

使用START WITH... CONNECT BY PRIOR...。




oracle 提供了start with connect by 語法結構可以實現遞歸查詢。

1. 一個簡單舉例:

SQL> select *  from test;

BILL_MONTH           DAY_NUMBER MSISDN

-------------------- ---------- --------------------

200803                        1 13800

200803                        3 13800

200803                        2 13800

200803                        2 13801

200803                        4 13804

200803                        5 13804

200803                        7 13804

200803                        8 13804

200803                        6 13802

200803                        6 13801

200803                        7 13801

200803                        8 13801

12 rows selected

SQL>

SQL> select * from test

  2       start with day_number=1

  3       connect by  prior day_number=day_number-1 and prior msisdn= msisdn

  4      ;

BILL_MONTH           DAY_NUMBER MSISDN

-------------------- ---------- --------------------

200803                        1 13800

200803                        2 13800

200803                        3 13800

SQL>

上面的語句查找出了從1開始,並且day_number 逐漸+1 遞增的,並且 msisdn 相同的哪些個數據.

2. start with  connect by 語法結構

 如上面說看到的 例子, 其語法結構爲  start with condition  connect by  condition (含 prior 關鍵字)

start with conditon 給出的seed 數據的範圍, connect by  後面給出了遞歸查詢的條件,prior 關鍵字表示父數據,prior 條件表示子數據需要滿足父數據的什麼條件。

在下面的這個start with connect by 結構中,就表示 查找出了從1開始,父數據的day_number等於子數據的day_number-1而且父數據的msisdn=子數據的msisdn.

start with day_number=1

     connect by  prior day_number=day_number-1 and prior msisdn= msisdn





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章