当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
递归查询查出层次树完整路径(四)
发布时间:2010/12/1 16:52:00 来源:www.xue.net 编辑:城市总裁吧
   North America /North America/Canada/Ontario/Ottawa

  North America /North America/Canada/Ontario/Toronto

  North America /North America/USA

  North America /North America/USA/California

  North America /North America/USA/California/Redwood Shores

  在Oracle 10g  之前的版本中,如果在你的树中出现了环状循环(如一个孩子节点引用一个父亲节点),Oracle 就会报出一个错误提示:“ ORA-01436:  CONNECT BY loop in user data”。如果不删掉对父亲的引用就无法执行查询操作。而在 Oracle 10g 中,只要指定 “NOCYCLE”就可以进行任意的查询操作。与这个关键字相关的还有一个伪列——CONNECT_BY_ISCYCLE,如果在当前行中引用了某个父亲节点的内容并在树中出现了循环,那么该行的伪列中就会显示“1”,否则就显示“0”。如下例所示:

  create table hier2

  (

  parent number,

  child number

  );

  insert into hier2 values(null,1);

  insert into hier2 values(1,2);

  insert into hier2 values(2,3);

  insert into hier2 values(3,1);

  select connect_by_iscycle,sys_connect_by_path(child,"/") path

  from hier2

  start with parent is null

  connect by nocycle prior child = parent;

  CONNECT_BY_ISCYCLE PATH

  ------------------ -------

  0 /1

  0 /1/2

  1 /1/2/3

  例如:  有一个 county 表 其中有parentid,id,name 分别代表父级编码,编码,地区名称

  select sys_connect_by_path(name,'/') from county t start with t.parentid is not null connect by prior id=parentid;

  其中 start with t.prarentid is not null 是要遍历所有父节点不为空的所有节点;connect by prior id=parentid是指的父子关系,如果希望显示结果是由小到大,则可以 connect by prior parentid=id

  语句的执行结果为:

  --------------------------------------------------------------------------------

  /浙江省

  /浙江省/杭州市

  /浙江省/杭州市/上城区

  /浙江省/杭州市/下城区

  /浙江省/杭州市/拱墅区

  /浙江省/杭州市/西湖区

  /浙江省/杭州市/萧山区

  /浙江省/杭州市/余杭区

  /浙江省/杭州市/淳安县

  /浙江省/杭州市/建德市

  /浙江省/杭州市/临安市

  /浙江省/杭州市/市辖区

  /浙江省/杭州市/江干区

  /浙江省/杭州市/滨江区

  /浙江省/杭州市/桐庐县

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved