Oracle 递归函数与拼接
2015-07-24 16:15
253 查看
SELECT SUBSTR(SYS_CONNECT_BY_PATH(tb.name,'->'),3) name FROM table tb START WITH nvl(tb.parentid,0)=0 CONNECT BY PRIOR ID=mt.parentid ;
在Oracle中,SYS_CONNECT_BY_PATH函数主要作用是可以把一个父节点下的所有子节点通过某个字符进行区分,然后连接在一个列中显示。
sys_connect_by_path(字段名, 2个字段之间的连接符号),注意这里的连接符号不要使用逗号,oracle会报错,
如果一定要用,可以使用replace替换一下,方法如下 REPLACE(字段名,原字符,',')。
还有,SYS_CONNECT_BY_PATH这个函数是oracle9i才新提出来的!它要和connect by子句合用。
例子:
1、创建表
CREATE TABLE SC_DISTRICT ( ID NUMBER(10) NOT NULL, PARENT_ID NUMBER(10), NAME VARCHAR2(255 BYTE) NOT NULL );
2、添加数据
INSERT INTO SC_DISTRICT(ID,NAME) VALUES(1,'四川省'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(2,1,'巴中市'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(3,1,'达州市'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(4,2,'巴州区'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(5,2,'通江县'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(6,2,'平昌县'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(7,3,'通川区'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(8,3,'宣汉县'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(9,8,'塔河乡'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(10,8,'三河乡'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(11,8,'胡家镇'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(12,8,'南坝镇'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(13,6,'大寨乡'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(14,6,'响滩镇'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(15,6,'龙岗镇'); INSERT INTO SC_DISTRICT(ID,PARENT_ID,NAME) VALUES(16,6,'白衣镇');
生成表与数据如下:
![](http://images0.cnblogs.com/blog2015/775982/201507/241604362874345.png)
1 查询巴中市下行政组织递归路径 2 SELECT ID, NAME, PARENT_ID, 3 SUBSTR(SYS_CONNECT_BY_PATH(NAME,'->'),3) NAME_PATH 4 FROM SC_DISTRICT 5 START WITH NAME='巴中市' 6 CONNECT BY PRIOR ID=PARENT_ID 7 8 查询结果: 9 ID NAME PARENT_ID NAME_PATH 10 2 巴中市 1 巴中市 11 4 巴州区 2 巴中市->巴州区 12 5 通江县 2 巴中市->通江县 13 6 平昌县 2 巴中市->平昌县 14 13 大寨乡 6 巴中市->平昌县->大寨乡 15 14 响滩镇 6 巴中市->平昌县->响滩镇 16 15 龙岗镇 6 巴中市->平昌县->龙岗镇 17 16 白衣镇 6 巴中市->平昌县->白衣镇
原文链接:/article/6028963.html
相关文章推荐
- oracle sql积累
- SSIS操作MSSQL的千万级数据导入到Oracle数据库
- CentOS7_x86_64创建Oracle实例且设置开机自启以及允许远程连接
- oracle使用exp与imp在本地导入导出数据
- Oracle使用imp/exop远程导入导出dmp数据
- oracle登录错误(ORA-01033:ORACLE initialization or shutdown in progress
- oracle序列的创建、删除和使用
- Oracle 给表添加主键和使ID自增、触发器、创建结构一样的表
- oracle,通过plsql创建用户表空间和所属用户示例
- [转]ORACLE函数大全
- Oracle使用imp导入dmp数据提示:只有DBA才能导入有其他DBA导入的文件
- Oracle数据库通过创建触发器实现自增功能
- Oracle分页查询语句(三)
- Oracle分页查询语句(二)
- Oracle分页查询语句(一)
- Oracle分页查询格式(十一)
- ORACLE-修改当前会话的语言环境
- Oracle 定时自动备份(windows任务计划,2016新增linux自动化备份)
- MySql分页和Oracle分页
- ORACLE 进程