一個常見的高級計算機科學(xué)問題可以在“有向圖”的范疇之下描述。有向圖是由一組向量和邊所連接的一組有限的節(jié)點。例如,一個節(jié)點可以想象為一座“城市”,而每個向量可以想象為兩座城市間的一個“航線”。 有很多算法和論文講到如何解決每種可能路線的遍歷問題以及尋找最短路徑或者最小代價路徑的問題。這些算法中大部分都是過程化的,或者是使用遞歸方面來解決的。然而 SQL 的聲明性語言使得解決復(fù)雜的有向圖問題更加輕易,而且不需要很多代碼。 讓我們以兩座城市之間的航線為例子,創(chuàng)建一個表保存一些假想數(shù)據(jù):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); 不能使用CONNECT BY 語法來解決如何從倫敦到圣保羅,因為在圖中有數(shù)據(jù)產(chǎn)生一個環(huán)(從圣保羅飛回):select * from fares connect by prior arrive = depart start with depart = 'LHR';
ERROR:
ORA-01436: CONNECT BY loop in user data 要解決有向圖問題,我們需要創(chuàng)建一個臨時表來保存兩個節(jié)點之間所有可能的路徑。我們必須注重不復(fù)制已經(jīng)處理過的路徑,而且在這種情況下,我們不想路徑走回開始處的同一個地點。我還希望跟蹤到達(dá)目的地所需航程的數(shù)目,以及所走路線的描述。 臨時表使用以下腳本創(chuàng)建:create global temporary table faretemp
(
depart char(3),
arrive char(3),
hops integer,
route varchar2(30),
price number,
constraint faretemp_pk primary key (depart,arrive)
); 一個簡單的視圖可以在稍微簡化這個例子中使用的代碼。視圖可以根據(jù) fares 表中的單個航程計算從 faretemp 表中的一個路徑到達(dá)一下一個航程的數(shù)據(jù):create or replace view nexthop
as
select src.depart,
dst.arrive,
src.hops+1 hops,
src.route','dst.arrive route,
src.price + dst.price price
from faretemp src,fares dst
where src.arrive = dst.depart
and dst.arrive !
= src.depart;
/
show errors;