【转】Oracle—Connect By Prior之环状循环解决方法
标签:
oracle数据库cycle环状循环it |
分类: 数据库 |
先把数据表建起来:
让我们以两座城市之间的航线为例子,创建一个表保存一些假想数据:
不能使用CONNECT
BY
语法来解决如何从伦敦到圣保罗,因为在图中有数据产生一个环(从圣保罗飞回):
Sql代码 http://bjyzxxds.iteye.com/images/icon_star.pngBy Prior之环状循环解决方法" />
-
create
table airports -
(
-
code
char(3) constraint airports_pk primary key, -
description
varchar2(200) -
);
-
-
insert
into airports values ('LHR','London Heathrow, );UK' -
insert
into airports values ('JFK','New York-Kennedy, );USA' -
insert
into airports values ('GRU','Sao Paulo, );Brazil' -
-
create
table fares -
(
-
depart
char(3), -
arrive
char(3), -
price
number, -
constraint
fares_pk primary key (depart,arrive), -
constraint
fares_depart_fk foreign key (depart) references airports, -
constraint
fares_arrive_fk foreign key (arrive) references airports -
);
-
-
insert
into fares values('LHR','JFK',700); -
insert
into fares values('JFK','GRU',600); -
insert
into fares values('LHR','GRU',1500); -
insert
into fares values('GRU','LHR',1600);
Sql代码 http://bjyzxxds.iteye.com/images/icon_star.pngBy Prior之环状循环解决方法" />
-
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”。
如果在当前行中引用了某个父亲节点的内容并在树中出现了循环,那么该行的伪列中就会显示“1”,否则就显示“0”。
语句如下:
select
connect_by_root(depart) depart,
connect by nocycle prior depart =
arrive;
查询结果如下:
http://s10/mw690/95d00794xcd40796c8539&690By Prior之环状循环解决方法" TITLE="【转】Oracle—Connect By Prior之环状循环解决方法" />
另一种方法:
要解决有向图问题,我们需要创建一个临时表来保存两个节点之间所有可能的路径。我们必须注意不复制已经处理过的路径,
而且在这种情况下,我们不想路径走回开始处的同一个地点。我还希望跟踪到达目的地所需航程的数目,以及所走路线的描述。
而且在这种情况下,我们不想路径走回开始处的同一个地点。我还希望跟踪到达目的地所需航程的数目,以及所走路线的描述。

加载中…