Oracle中遞迴查詢(START WITH……CONNECT BY……)
阿新 • • 發佈:2022-04-22
1、基本語法
在Oracle中START WITH……CONNECT BY……一般用來查詢存在父子關係的資料,也就是樹形結構的資料。
SELECT * FROM TABLE WHERE 條件3 START WITH 條件1 CONNECT BY 條件2;
- start with [condition]:設定起點,用來限制第一層的資料,或者叫根節點資料;以這部分資料為基礎來查詢第二層資料,然後以第二層資料查詢第三層資料以此類推。省略後預設以全部行為起點。
- connect by [condition] :用來指明在查詢資料時以怎樣的一種關係去查詢;比如說查詢第二層的資料時用第一層資料某個欄位進行匹配,如果這個條件成立那麼查找出來的資料就是第二層資料,同理往下遞迴匹配。
- prior : 表示上一層級的識別符號。經常用來對下一層級的資料進行限制。不可以接偽列。PRIOR在等號前面和後面,查詢的資料是不一樣的,如下用例:
- level :偽列(關鍵字),代表樹形結構中的層級編號。
- connect_by_root() :顯示根節點列。經常用來分組。
- connect_by_isleaf :1是葉子節點,0不是葉子節點。在製作樹狀表格時必用關鍵字。
- sys_connect_by_path() :將遞迴過程中的列進行拼接。
- nocycle , connect_by_iscycle : 在有迴圈結構的查詢中使用。
- siblings : 保留樹狀結構,對兄弟節點進行排序
2、基本案例解釋
以下用的表結構來源於 測試用例資料 。
1)最基本查詢
--從PARENT為空開始掃描 SELECT * FROM tab_connect_by A START WITH A.PARENT IS NULL CONNECT BY PRIOR A.CHILD = A.PARENT;
SELECT * FROM tab_connect_by A WHERE A.PARENT = '5'--條件3 START WITH A.PARENT = '15' --條件1 CONNECT BY PRIOR A.CHILD = A.PARENT;--條件2
查詢結果如下:
根據結果可以看出,條件的優先順序,根據start with後的條件查詢第一條資料,然後根據connect by的條件,利用先決條件(start with)查詢的child為起點作為下條資料的父節點遞迴查詢所有的資料;
其中where是根據最後所有遞迴出的資料再進行過濾。
2)prior的用法
--PRIOR在等號前面,向下遞迴,查詢對應的子節點 SELECT * FROM tab_connect_by A START WITH A.PARENT = '15' CONNECT BY PRIOR A.CHILD = A.PARENT; --PRIOR在等號後面,向上遞迴,查詢對應的子節點 SELECT * FROM tab_connect_by A START WITH A.PARENT = '15' CONNECT BY A.CHILD = PRIOR A.PARENT; SELECT * FROM tab_connect_by A START WITH A.PARENT = '15' CONNECT BY PRIOR A.PARENT = A.CHILD;
查詢結果如下:根據案例可以理解一下prior的用法。
3)其他
SELECT A.PARENT ,A.CHILD ,LEVEL "層次" ,SYS_CONNECT_BY_PATH(CHILD, '<-') "合併層次" ,PRIOR A.CHILD "父節點" ,CONNECT_BY_ROOT A.CHILD "根節點" ,DECODE(CONNECT_BY_ISLEAF, 1, A.CHILD, NULL) "子節點" ,DECODE(CONNECT_BY_ISLEAF, 1, '是', '否') "是否子節點" FROM TAB_CONNECT_BY A START WITH A.PARENT IS NULL --從PARENT為空開始掃描 CONNECT BY PRIOR A.CHILD = A.PARENT --以CHILD為父列連線PARENT ORDER SIBLINGS BY CHILD DESC --對層次排序 ;
查詢結果如下: