加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

【转】Oracle—Connect By Prior之环状循环解决方法

(2012-10-30 13:50:22)
标签:

oracle

数据库

cycle

环状

循环

it

分类: 数据库
先把数据表建起来:
让我们以两座城市之间的航线为例子,创建一个表保存一些假想数据: 
Sql代码  http://bjyzxxds.iteye.com/images/icon_star.pngBy Prior之环状循环解决方法" />
  1. create table airports  
  2.  
  3. code char(3) constraint airports_pk primary key 
  4. description varchar2(200)  
  5. );  
  6.   
  7. insert into airports values ('LHR','London Heathrow, UK');  
  8. insert into airports values ('JFK','New York-Kennedy, USA');  
  9. insert into airports values ('GRU','Sao Paulo, Brazil');  
  10.   
  11. create table fares  
  12.  
  13. depart char(3),  
  14. arrive char(3),  
  15. price number,  
  16. constraint fares_pk primary key (depart,arrive),  
  17. constraint fares_depart_fk foreign key (depart) references airports,  
  18. constraint fares_arrive_fk foreign key (arrive) references airports  
  19. );  
  20.   
  21. insert into fares values('LHR','JFK',700);  
  22. insert into fares values('JFK','GRU',600);  
  23. insert into fares values('LHR','GRU',1500);  
  24. insert into fares values('GRU','LHR',1600);  
不能使用CONNECT BY 语法来解决如何从伦敦到圣保罗,因为在图中有数据产生一个环(从圣保罗飞回): 

Sql代码  http://bjyzxxds.iteye.com/images/icon_star.pngBy Prior之环状循环解决方法" />
  1. select from fares connect by prior arrive depart start with depart 'LHR' 

ERROR: 
ORA-01436: CONNECT BY loop in user data 

解决方法:
在 Oracle 10g 中,只要指定“NOCYCLE”就可以进行任意的查询操作。与这个关键字相关的还有一个伪列——CONNECT_BY_ISCYCLE, 
如果在当前行中引用了某个父亲节点的内容并在树中出现了循环,那么该行的伪列中就会显示“1”,否则就显示“0”。 

语句如下:
select connect_by_root(depart) depart,
       depart,
       level,
       connect_by_iscycle iscycled,
       sys_connect_by_path(depart, '/') path
  from fares
 start with depart = 'LHR'
connect by nocycle prior depart = arrive;

查询结果如下:
http://s10/mw690/95d00794xcd40796c8539&690By Prior之环状循环解决方法" TITLE="【转】Oracle—Connect By Prior之环状循环解决方法" />


另一种方法:
要解决有向图问题,我们需要创建一个临时表来保存两个节点之间所有可能的路径。我们必须注意不复制已经处理过的路径, 
而且在这种情况下,我们不想路径走回开始处的同一个地点。我还希望跟踪到达目的地所需航程的数目,以及所走路线的描述。 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有