假设有一批货物要从防城运到丹东,方案如下:
1. 防城->黄埔->烟台->丹东
2. 防城->黄埔->上海->烟台->丹东
方案1的中转次数最少,所以方案1为最优方案
数据如下:
开航港口 抵达港口 航线
防城 黄埔 南方支线
黄埔 烟台 烟埔线
黄埔 上海 申埔线
上海 烟台 烟申线
烟台 丹东 北方支线
丹东 烟台 北方支线
烟台 黄埔 烟埔线
烟台 上海 烟申线
上海 黄埔 申埔线
黄埔 防城 南方支线
期望数据:
开航港口 抵达港口 航线 顺序
防城 黄埔 南方支线 1
黄埔 烟台 烟埔线 2
烟台 丹东 北方支线 3
SQL脚本如下:
create table tbl_plan
(
port1 varchar2(10),
port2 varchar2(10),
line varchar2(10)
);
insert into tbl_plan values('防城', '黄埔', '南方支线');
insert into tbl_plan values('黄埔', '烟台', '烟埔线');
insert into tbl_plan values('黄埔', '上海', '申埔线');
insert into tbl_plan values('上海', '烟台', '烟申线');
insert into tbl_plan values('烟台', '丹东', '北方支线');
insert into tbl_plan values('丹东', '烟台', '北方支线');
insert into tbl_plan values('烟台', '黄埔', '烟埔线');
insert into tbl_plan values('烟台', '上海', '烟申线');
insert into tbl_plan values('上海', '黄埔', '申埔线');
insert into tbl_plan values('黄埔', '防城', '南方支线');
DQTEST1@MYDB> l
1 select path,
2 deepth
3 from (select min('防城' || '->' || ltrim(sys_connect_by_path(port2, '->'), '->')) path,
4 port1,
5 port2,
6 line,
7 level deepth
8 from tbl_plan
9 start with port1 = '防城'
10 connect by nocycle prior port2 = port1
11 group by port1,
12 port2,
13 line,
14 level)
15* where port2 = '丹东'
DQTEST1@MYDB> /
PATH DEEPTH
------------------------------ ----------
防城->黄埔->烟台->丹东 3
防城->黄埔->上海->烟台->丹东 4
DQTEST1@MYDB>