国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Oracle中connect by...start with...的使用【轉】

2019-11-08 20:36:32
字體:
來源:轉載
供稿:網友

Oracle中connect by...start with...的使用

一、語法 大致寫法:select * from some_table [where 條件1] connect by [條件2] start with [條件3]; 其中 connect by 與 start with 語句擺放的先后順序不影響查詢的結果,[where 條件1]可以不需要。 [where 條件1]、[條件2]、[條件3]各自作用的范圍都不相同: [where 條件1]是在根據“connect by [條件2] start with [條件3]”選擇出來的記錄中進行過濾,是針對單條記錄的過濾, 不會考慮樹的結構; [條件2]指定構造樹的條件,以及對樹分支的過濾條件,在這里執行的過濾會把符合條件的記錄及其下的所有子節點都過濾掉; [條件3]限定作為搜索起始點的條件,如果是自上而下的搜索則是限定作為根節點的條件,如果是自下而上的搜索則是限定作為葉子節點的條件; 示例: 假如有如下結構的表:some_table(id,p_id,name),其中p_id保存父記錄的id。 select * from some_table t where t.id!=123 connect by PRior t.p_id=t.id and t.p_id!=321 start with t.p_id=33 or t.p_id=66; 對prior的說明:     prior存在于[條件2]中,可以不要,不要的時候只能查找到符合“start with [條件3]”的記錄,不會在尋找這些記錄的子節點。要的時候有兩種寫法:connect by prior t.p_id=t.id 或 connect by t.p_id=prior t.id,前一種寫法表示采用自上而下的搜索方式(先找父節點然后找子節點),后一種寫法表示采用自下而上的搜索方式(先找葉子節點然后找父節點)。 二、執行原理 connect by...start with...的執行原理可以用以下一段程序的執行以及對存儲過程RECURSE()的調用來說明: /* 遍歷表中的每條記錄,對比是否滿足start with后的條件,如果不滿足則繼續下一條, 如果滿足則以該記錄為根節點,然后調用RECURSE()遞歸尋找該節點下的子節點, 如此循環直到遍歷完整個表的所有記錄 。*/ for rec in (select * from some_table) loop if FULLFILLS_START_WITH_CONDITION(rec) then     RECURSE(rec, rec.child); end if; end loop; /* 尋找子節點的存儲過程*/ procedure RECURSE (rec in MATCHES_SELECT_STMT, new_parent IN field_type) is begin APPEND_RESULT_LIST(rec); /*把記錄加入結果集合中*/ /*再次遍歷表中的所有記錄,對比是否滿足connect by后的條件,如果不滿足則繼續下一條, 如果滿足則再以該記錄為根節點,然后調用RECURSE()繼續遞歸尋找該節點下的子節點, 如此循環直到找至葉子節點。*/ for rec_recurse in (select * from some_table) loop     if FULLFILLS_CONNECT_BY_CONDITION(rec_recurse.child, new_parent) then       RECURSE(rec_recurse,rec_recurse.child);     end if; end loop; end procedure RECURSE; 三、使用探討     從上面的執行原理可以看到“connect by...start with...”構造樹的方式是:(1)如果是自上而下方式,則把表中的每一條記錄都作為根節點來生成樹,所以表中有多少條記錄就會構造出多少棵樹。(2)如果是自下而上的搜索方式,則把表中的每一條記錄都作為葉子節點來生成分支,所以表中有多少條記錄就會生成多少條分支。     因此如果表中的記錄不是嚴格遵照每條記錄都只能有一個父記錄的原則,那么就可能有部分記錄會存在于多棵樹中,那么在查找記錄的時候就可能會出現找到多條重復記錄的異常情況--1.Hierarchical Queries: START WITH and CONNECT BY PRIOR clauses --Hierarchical Queries--START WITH and CONNECT BY PRIOR clauses.SELECT employee_id, manager_id, first_name, last_nameFROM employee_jhSTART WITH employee_id = 1CONNECT BY PRIOR employee_id = manager_id;EMPLOYEE_ID MANAGER_ID FIRST_NAME LAST_NAME----------- ---------- ---------- ----------          1          0 James      Smith          2          1 Ron        Johnson          3          2 Fred       Hobbs          5          2 Rob        Green          4          1 Susan      Jones          6          4 Jane       Brown          9          6 Henry      Heyson          7          4 John       Grey          8          7 Jean       Blue         10          1 Kevin      Black         11         10 Keith      Long         12         10 Frank      Howard         13         10 Doreen     Penn13 rows selected.--2.Using a Subquery in a START WITH ClauseSELECT LEVEL,       LPAD(' ', 2 * LEVEL - 1) || first_name || ' ' || last_name AS employeeFROM employee_jhSTART WITH employee_id = (SELECT employee_id FROM employee_jh WHERE first_name = 'Kevin' AND last_name = 'Black')CONNECT BY PRIOR employee_id = manager_id;     LEVEL EMPLOYEE---------- -------------------------         1  Kevin Black         2    Keith Long         2    Frank Howard         2    Doreen Penn--3.Including Other Conditions in a Hierarchical QuerySELECT LEVEL,       LPAD(' ', 2 * LEVEL - 1) || first_name || ' ' ||       last_name AS employee, salaryFROM employee_jhWHERE salary <= 50000START WITH employee_id = 1CONNECT BY PRIOR employee_id = manager_id;     LEVEL EMPLOYEE                      SALARY---------- ------------------------- ----------         3      Rob Green                 40000         3      Jane Brown                45000         4        Henry Heyson            30000         3      John Grey                 30000         4        Jean Blue               29000         3      Keith Long                50000         3      Frank Howard              45000         3      Doreen Penn               470008 rows selected.原文: http://zhidao.baidu.com/question/219362803.html

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 黎川县| 日喀则市| 汕尾市| 金昌市| 清原| 高平市| 彰武县| 隆子县| 东宁县| 堆龙德庆县| 通州市| 彭水| 鄂伦春自治旗| 华坪县| 瑞昌市| 凤庆县| 通山县| 静乐县| 基隆市| 洪湖市| 饶河县| 亚东县| 固阳县| 西畴县| 宿州市| 松滋市| 白玉县| 甘泉县| 乃东县| 阿城市| 长葛市| 石首市| 昌邑市| 湖南省| 临西县| 甘肃省| 苍南县| 略阳县| 武山县| 奉化市| 太和县|