工作中遇到下面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 完成