【发布时间】:2017-04-19 11:22:36
【问题描述】:
我无法获得一份声明以获取航班上所有中途停留的信息。
我有如下的航线表,其中有一个源机场和一个目的地机场。 现在我想获得从机场 A 到机场 B 的最短航线(中途停留最少),没有从 A 到 B 的直达航线,所以我必须将多条航线连接在一起。
例如,如果我想从 18 到 1403,我想获取路线
(18 > 24 | 24 > 87 | 87 > 1403)
而不是
(18 > 24 | 24 > 87 | 87 > 99| 99 > 1403)
这是一些测试数据
src_apid | dst_apid
---------+----------
18 | 24
24 | 87
87 | 99
87 | 1403
99 | 18
99 | 1403
我的尝试如下所示:
WITH rejkabrest (
src_apid,
dst_apid
) AS (
SELECT
src_apid,
dst_apid
FROM
routes
WHERE
src_apid = 18
UNION ALL
SELECT
a.src_apid,
a.dst_apid
FROM
routes a
INNER JOIN rejkabrest b ON a.src_apid = b.dst_apid
WHERE b.dst_apid = 1403
) SELECT
src_apid, dst_apid
FROM
rejkabrest;
但是这种方式我只能得到从源机场 18 开始的所有路线。如果我尝试另一种方式,我会遇到循环问题。
希望你们能帮助我。非常感谢!
【问题讨论】:
-
This answer 是 SQL-Server 语法,但可能会为您指明方向。主要技巧是,在所有访问过的站点中携带一个不断增长的字符串,并在重新访问一个地方时停止递归。
标签: sql oracle shortest-path