使用oracle connect by 查询路径
2015-01-12 13:53
281 查看
项目中有如下需求:
查出图中一个点到另一个点的路径。
![](http://img.blog.csdn.net/20150112135647367?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXdlbnpoYW5nYw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
方法:
1、 自己写算法
2、 将数据导入neo4j,通过neo4j进行查询(图数据库)
3、 通过oracleconnect by 查询
这里介绍的是方法三
在该例子中查询的是节点A->H的路径。
数据库中表结构如下:
插入数据
数据库中的数据为
![](http://img.blog.csdn.net/20150112140448191?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXdlbnpoYW5nYw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
查询语句
查询结果
![](http://img.blog.csdn.net/20150112140541449?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXdlbnpoYW5nYw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
注意事项
1、在查询时,由于存在循环问题,需要使用NOCYCLE进行控制。否则会抛错【ora-01436用户数据中的Connect by 循环】。
问题:
1、 当数据库中的路径数很多时,查询出的路径有很多循环回路,需要通过level进行控制。
2、 当数据量非常大时,查询可能存在性能问题,可能需要采用方法二。
参考文档:
http://blog.chinaunix.net/uid-639115-id-139607.html
/article/4621234.html
查出图中一个点到另一个点的路径。
方法:
1、 自己写算法
2、 将数据导入neo4j,通过neo4j进行查询(图数据库)
3、 通过oracleconnect by 查询
这里介绍的是方法三
在该例子中查询的是节点A->H的路径。
数据库中表结构如下:
create table TOBJ_CSTOISS ( fstr_startcrossid VARCHAR2(20), fstr_endcrossid VARCHAR2(20), fstr_issueid VARCHAR2(500), fstr_length NUMBER )
插入数据
insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('K', 'A', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('A', 'B', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('B', 'C', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('H', 'J', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('B', 'D', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('B', 'E', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('D', 'F', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('D', 'H', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('F', 'H', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('E', 'G', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('E', 'M', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('G', 'H', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('C', 'A', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('H', 'I', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('B', 'N', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('N', 'P', null, null); insert into TOBJ_CSTOISS (fstr_startcrossid, fstr_endcrossid, fstr_issueid, fstr_length) values ('P', 'B', null, null); commit;
数据库中的数据为
查询语句
select t2.* from ---1begin ( select t.* ,CONNECT_BY_ROOT t.fstr_startcrossid || SYS_CONNECT_BY_PATH(t.fstr_endcrossid, '-') as path --查出根节点和路径 ,level--层级 ,CONNECT_BY_ISCYCLE as cycle --是否是循环节点1cycle,0normal from TOBJ_CSTOISS t connect by NOCYCLE t.fstr_startcrossid = prior t.fstr_endcrossid start with t.fstr_startcrossid = 'A' )t2 ---1end where t2.path like 'A%H'
查询结果
注意事项
1、在查询时,由于存在循环问题,需要使用NOCYCLE进行控制。否则会抛错【ora-01436用户数据中的Connect by 循环】。
问题:
1、 当数据库中的路径数很多时,查询出的路径有很多循环回路,需要通过level进行控制。
2、 当数据量非常大时,查询可能存在性能问题,可能需要采用方法二。
参考文档:
http://blog.chinaunix.net/uid-639115-id-139607.html
/article/4621234.html
相关文章推荐
- oracle中进行简单树查询(递归查询) ,PRIOR、CONNECT_BY_ROOT的使用 .
- oracle 查询有层级关系的全路径:sys_connect_by_path
- oracle中进行简单树查询(递归查询) ,PRIOR、CONNECT_BY_ROOT的使用
- Oracle使用connect by循环查询从某个时间到某个时间的时间
- 使用oracle的start with... connect by prior根据子节点,找到从子节点到根目录所有路径
- Oracle树结构查询 start with ... connect by用法简介
- Oracle树结构查询 start with ... connect by用法简介&sql有向图问题期待新解决方案
- oracle树结构查询----connect by语法详解
- Oracle Connect by 使用方法
- 傅老师课堂:Oracle高级查询之CONNECT BY
- sqlserver下用函数实现 oracle 的树查询( start with connect by ) 功能
- ORACLE 层次结构查询语句 start with connect by 你用过吗?
- Oracle 迭代查询 CONNECT BY PRIOR ……START WITH ……
- oracle格式化查询(start with ,connect by prior )使用情况
- ORACLE树查询,start with ... connect by prior ...
- oracle使用connect by prior对树形表结构进行递归查询
- ORACLE查询树型关系(connect by prior start with)
- ORACLE 树形查询(connect by...start with...)的应用
- ORACLE查询树型关系(start with connect by prior)
- Oracle树结构查询(connect by ...)