轉自:https://blog.csdn.net/qq_29274091/article/details/72627350
Oracle中start with和connect by 用法理解
轉自: http://www.blogjava.net/xzclog/archive/2010/03/05/314642.html,多謝博主分享
connect by 是結構化查詢中用到的,其基本語法是:
轉自: http://www.blogjava.net/xzclog/archive/2010/03/05/314642.html,多謝博主分享
1 select … from tablename 2 start with 條件1 3 connect by 條件2 4 where 條件3;
例:
1 select * from table 2 start with org_id = ‘HBHqfWGWPy’ 3 connect by prior org_id = parent_id;
簡單說來是將一個樹狀結構存儲在一張表里,比如一個表中存在兩個字段:org_id,parent_id,那么通過表示每一條記錄的parent是誰,就可以形成一個樹狀結構,用上述語法的查詢可以取得這棵樹的所有記錄,其中:
條件1 是根結點的限定語句,當然可以放寬限定條件,以取得多個根結點,實際就是多棵樹。
條件2 是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR org_id = parent_id;就是說上一條記錄的org_id 是本條記錄的parent_id,即本記錄的父親是上一條記錄。
條件3 是過濾條件,用於對返回的所有記錄進行過濾。
條件2 是連接條件,其中用PRIOR表示上一條記錄,比如 CONNECT BY PRIOR org_id = parent_id;就是說上一條記錄的org_id 是本條記錄的parent_id,即本記錄的父親是上一條記錄。
條件3 是過濾條件,用於對返回的所有記錄進行過濾。
簡單介紹如下:
在掃描樹結構表時,需要依此訪問樹結構的每個節點,一個節點只能訪問一次,其訪問的步驟如下:
第一步:從根節點開始;
第二步:訪問該節點;
第三步:判斷該節點有無未被訪問的子節點,若有,則轉向它最左側的未被訪問的子節,並執行第二步,否則執行第四步;
第四步:若該節點為根節點,則訪問完畢,否則執行第五步;
第五步:返回到該節點的父節點,並執行第三步驟。
總之:掃描整個樹結構的過程也即是中序遍歷樹的過程。
在掃描樹結構表時,需要依此訪問樹結構的每個節點,一個節點只能訪問一次,其訪問的步驟如下:
第一步:從根節點開始;
第二步:訪問該節點;
第三步:判斷該節點有無未被訪問的子節點,若有,則轉向它最左側的未被訪問的子節,並執行第二步,否則執行第四步;
第四步:若該節點為根節點,則訪問完畢,否則執行第五步;
第五步:返回到該節點的父節點,並執行第三步驟。
總之:掃描整個樹結構的過程也即是中序遍歷樹的過程。
1.樹結構的描述
樹結構的數據存放在表中,數據之間的層次關系即父子關系,通過表中的列與列間的關系來描述,如EMP表中的EMPNO和MGR,EMPNO表示該雇員的編號,MGR表示領導該雇員的人的編號,即子節點的MGR值等於父節點的EMPNO值。在表的每一行中都有一個表示父節點的MGR(除根節點外),通過每個節點的父節點,就可以確定整個樹結構。
在SELECT命令中使用CONNECT BY 和START WITH 子句可以查詢表中的樹型結構關系,其命令格式如下:
SELECT . . .
CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 裂名2}
[START WITH];
其中:CONNECT BY子句說明每行數據將是按層次順序檢索,並規定將表中的數據連入樹型結構的關系中。PRIOR運算符必須放置在連接關系的兩列中某一個的前面。對於節點間的父子關系,PRIOR運算符在一側表示父節點,在另一側表示子節點,從而確定查找樹結構是的順序是自頂向下還是自底向上。
在連接關系中,除了可以使用列名外,還允許使用列表達式。START WITH 子句為可選項,用來標識哪個節點作為查找樹型結構的根節點,若該子句被省略,則表示所有滿足查詢條件的行作為根節點。
START WITH:不但可以指定一個根節點,還可以指定多個根節點。
START WITH:不但可以指定一個根節點,還可以指定多個根節點。
2.關於PRIOR
運算符PRIOR被放置於等號前后的位置,決定着查詢時的檢索順序。
PRIOR被置於CONNECT BY子句中等號的前面時,則強制從根節點到葉節點的順序檢索,即由父節點向子節點方向通過樹結構,我們稱之為自頂向下的方式。如:
CONNECT BY PRIOR EMPNO=MGR
PIROR運算符被置於CONNECT BY 子句中等號的后面時,則強制從葉節點到根節點的順序檢索,即由子節點向父節點方向通過樹結構,我們稱之為自底向上的方式。例如:
CONNECT BY EMPNO=PRIOR MGR
在這種方式中也應指定一個開始的節點。
運算符PRIOR被放置於等號前后的位置,決定着查詢時的檢索順序。
PRIOR被置於CONNECT BY子句中等號的前面時,則強制從根節點到葉節點的順序檢索,即由父節點向子節點方向通過樹結構,我們稱之為自頂向下的方式。如:
CONNECT BY PRIOR EMPNO=MGR
PIROR運算符被置於CONNECT BY 子句中等號的后面時,則強制從葉節點到根節點的順序檢索,即由子節點向父節點方向通過樹結構,我們稱之為自底向上的方式。例如:
CONNECT BY EMPNO=PRIOR MGR
在這種方式中也應指定一個開始的節點。
3.定義查找起始節點
在自頂向下查詢樹結構時,不但可以從根節點開始,還可以定義任何節點為起始節點,以此開始向下查找。這樣查找的結果就是以該節點為開始的結構樹的一枝。
在自頂向下查詢樹結構時,不但可以從根節點開始,還可以定義任何節點為起始節點,以此開始向下查找。這樣查找的結果就是以該節點為開始的結構樹的一枝。
4.使用LEVEL
在具有樹結構的表中,每一行數據都是樹結構中的一個節點,由於節點所處的層次位置不同,所以每行記錄都可以有一個層號。層號根據節點與根節點的距離確定。不論從哪個節點開始,該起始根節點的層號始終為1,根節點的子節點為2, 依此類推。圖1.2就表示了樹結構的層次。
在具有樹結構的表中,每一行數據都是樹結構中的一個節點,由於節點所處的層次位置不同,所以每行記錄都可以有一個層號。層號根據節點與根節點的距離確定。不論從哪個節點開始,該起始根節點的層號始終為1,根節點的子節點為2, 依此類推。圖1.2就表示了樹結構的層次。
5.節點和分支的裁剪
在對樹結構進行查詢時,可以去掉表中的某些行,也可以剪掉樹中的一個分支,使用WHERE子句來限定樹型結構中的單個節點,以去掉樹中的單個節點,但它卻不影響其后代節點(自頂向下檢索時)或前輩節點(自底向頂檢索時)。
在對樹結構進行查詢時,可以去掉表中的某些行,也可以剪掉樹中的一個分支,使用WHERE子句來限定樹型結構中的單個節點,以去掉樹中的單個節點,但它卻不影響其后代節點(自頂向下檢索時)或前輩節點(自底向頂檢索時)。
6.排序顯示
像在其它查詢中一樣,在樹結構查詢中也可以使用ORDER BY 子句,改變查詢結果的顯示順序,而不必按照遍歷樹結構的順序。
像在其它查詢中一樣,在樹結構查詢中也可以使用ORDER BY 子句,改變查詢結果的顯示順序,而不必按照遍歷樹結構的順序。
7. 實例
oracle 提供了start with connect by 語法結構可以實現遞歸查詢。
1. 一個簡單舉例:
上面的語句查找出了從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
1. 一個簡單舉例:
1 SQL> select * from test; 2 BILL_MONTH DAY_NUMBER MSISDN 3 -------------------- ---------- -------------------- 4 200803 1 13800 5 200803 3 13800 6 200803 2 13800 7 200803 2 13801 8 200803 4 13804 9 200803 5 13804 10 200803 7 13804 11 200803 8 13804 12 200803 6 13802 13 200803 6 13801 14 200803 7 13801 15 200803 8 13801 16 12 rows selected 17 18 SQL> 19 SQL> select * from test 20 2 start with day_number=1 21 3 connect by prior day_number=day_number-1 and prior msisdn= msisdn 22 4 ; 23 24 BILL_MONTH DAY_NUMBER MSISDN 25 -------------------- ---------- -------------------- 26 200803 1 13800 27 200803 2 13800 28 200803 3 13800 29 30 SQL>
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