ORACLE - START WITH \ CONNECT BY PRIOR 、SYS_CONNECT_BY_PATH

工作中遇到下面SQL , 表名隱去
SELECT A.OBJID
,A.STEXT
,A.SOBID
,SUBSTR(SYS_CONNECT_BY_PATH(A.OBJID, ‘,’), 2)
FROM XXXXX A
START WITH OBJID = ‘50022709’
CONNECT BY PRIOR OBJID = SOBID;

下面在自己環境中研究該函數

1 建表

create table TEST1
(
  obj_id number,
  dwbm number,
  sdwbm number,
  dwmc  varchar2(50)
) ;
comment on column TEST1.obj_id
  is '唯一標識';
comment on column TEST1.dwbm
  is '單位編碼';
comment on column TEST1.sdwbm
  is '上級單位編碼';
comment on column TEST1.dwmc
  is '單位名稱';

CREATE SEQUENCE "TEST1_SEQ"  MINVALUE 1 MAXVALUE 9999 INCREMENT BY 1 START WITH 1 NOCACHE NOORDER NOCYCLE;

2 插入測試數據
這裏寫圖片描述

3 需求: 查找出保定市下的所有下級單位 (保定 高碑店 定興 )

select dwbm,sdwbm,dwmc from TEST1 
start with dwbm = '860312' 
connect by prior dwbm = sdwbm ;

這裏寫圖片描述
可見 start with 是查樹列表開始條件. (根結點)
connect by prior 就是說上一條記錄的dwbm是本條記錄的sdwbm

4 需求:把保定結點下的單位名稱顯示在同一行 保定-高碑店 樣式

select dwbm, sdwbm, dwmc, SYS_CONNECT_BY_PATH(dwmc, '-')
  from TEST1
 start with dwbm = '860312'
connect by prior dwbm = sdwbm;

這裏寫圖片描述

去掉前面的第一個 - 加個substr()截取

select dwbm, sdwbm, dwmc, substr(SYS_CONNECT_BY_PATH(dwmc, '-'),2)
      from TEST1
     start with dwbm = '860312'
    connect by prior dwbm = sdwbm;

這裏寫圖片描述

5 完成

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章