1. 程式人生 > 其它 >Oracle中遞迴查詢(START WITH……CONNECT BY……)

Oracle中遞迴查詢(START WITH……CONNECT BY……)

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 --對層次排序  
; 

查詢結果如下: