1. 程式人生 > >ORACLE-SYS_CONNECT_BY_PATH函式彙總

ORACLE-SYS_CONNECT_BY_PATH函式彙總


SYS_CONNECT_BY_PATH(column_name,'分隔符')函式

第一個引數是形成樹形式的欄位,第二個引數是父級和其子級分隔顯示用的分隔符

偽列CONNECT_BY_ROOT,CONNECT_BY_LEAF,CONNECT_BY_ISCYCLE

示例1:查詢表中樹結構並轉化為文字展示(轉載)

SELECT LTRIM(MAX(SYS_CONNECT_BY_PATH(ou_code, ';')), ';') AS RESULT
      FROM (SELECT category_id, ou_code, RN, LEAD(RN) OVER(ORDER BY RN) RN1
              FROM (SELECT category_id,
                           ou_code,
                           ROW_NUMBER() OVER(ORDER BY category_id, ou_code DESC) RN
                      FROM (SELECT t.category_id, t.ou_code
                              FROM bpm_dcs_category_ou t
                             WHERE t.category_id=1000085)))
     START WITH RN1 IS NULL
            AND category_id = 1000085
    CONNECT BY RN1 = PRIOR RN;

示例2:列轉行(轉載)
view plaincopy to clipboardprint
select max(substr(sys_connect_by_path(column_name,','),2))  
from (select column_name,rownum rn from user_tab_columns where table_name ='DEPT')  
start with rn=1 connect by rn=rownum ;  
 
MAX(SUBSTR(SYS_CONNECT_BY_PATH(COLUMN_NAME,','),2))  
--------------------------------------------------------------------------------  
DEPTNO,DEPTNAME,MGRNO  

MAX(SUBSTR(SYS_CONNECT_BY_PATH(COLUMN_NAME,';'),2)) 先連線所有節點,從第二個字元開始擷取,取最完整條目

其作用於LTRIM(MAX(SYS_CONNECT_BY_PATH(COLUMN_NAME,';')),';')(先連線所有節點,取最完整條目,刪除左側字元‘;’)類似

補充:結構化查詢

START WITH ...CONNNECT BY PRIOR基本語法是:

SELECT ...FROM

START WITH (根節點,可以指定多個節點)
CONNECT BY PRIOR= (連線條件,PRIOR置於等號前,則從根節點到葉節點開始檢索;置於等號後,則從葉節點到根節點開始檢索)
WHERE (過濾返回記錄,僅過濾被限定節點,其根節點和子節點均不受影響)

該查詢訪問路徑如下:

從根節點開始,向下掃描子節點,該子節點已被訪問則轉向其最左側未被訪問的子節點,否則判斷該節點是否為根節點,是則訪問完畢,否則返回父節點重新執行判斷。

即掃描整表判斷所有節點樹結構(遍歷樹結構)。