同事的一个需求,表信息如下:
SQL> SELECT * FROM YANSP ORDER BY BRH_LVL,1;
BRH_ID BRH_NM SUP_BRH_ID BR
------ -------------- -------------- --
1 山东 0 1
2 上海 0 1
3 日照 1 2
4 临沂 1 2
10 闵行 2 3
11 北蔡 8 3
12 唐镇 8 3
5 莒县 3 3
6 东港 3 3
7 五莲 3 3
8 浦东新区 2 3
9 宝山 2 3
已选择12行。
显示结果类似如下形式:
省份 市 县 LEVEL
山东 NULL NULL 1
山东 日照 NULL 2
山东 日照 莒县 3
山东 日照 东港 3
山东 日照 五莲 3
SQL实现如下
SQL> COL SUPNAME FORMAT A15
SQL> COL BRH_NAME FORMAT A15
SQL> COL CHILD_NAME FORMAT A15
SQL> SELECT SUPNAME,
2 DECODE(LVL,1,NULL,2,TRIM(BRH_NM),3,
3 TRIM(SUBSTR(BRH_NAME_PATH,INSTR(BRH_NAME_PATH,'/',1,2)+1,INST
R(BRH_NAME_PATH,'/',1,3)-INSTR(BRH_NAME_PATH,'/',1,2)-1))) BRH_NAME,
4 DECODE(LVL,1,NULL,2,NULL,3,TRIM(BRH_NM)) CHILD_NAME,
5 BRH_LVL
6 FROM (
7 SELECT CONNECT_BY_ROOT(BRH_NM) SUPNAME,
8 SYS_CONNECT_BY_PATH(BRH_NM,'/') BRH_NAME_PATH,
9 T.BRH_LVL,BRH_ID,LEVEL LVL,BRH_NM
10 FROM YANSP T
11 START WITH SUP_BRH_ID=0
12 CONNECT BY NOCYCLE PRIOR BRH_ID=SUP_BRH_ID
13 ) ;
SUPNAME BRH_NAME CHILD_NAME BR
--------------- --------------- --------------- --
山东 1
山东 日照 2
山东 日照 莒县 3
山东 日照 东港 3
山东 日照 五莲 3
山东 临沂 2
上海 1
上海 闵行 3
上海 浦东新区 3
上海 浦东新区 北蔡 3
上海 浦东新区 唐镇 3
上海 宝山 3
已选择12行。
SQL>
阅读(1291) | 评论(0) | 转发(0) |