У меня проблемы с получением справки о всех пересадках рейса.
У меня есть таблица с маршрутами полета, как показано ниже, в которой есть аэропорт-источник и аэропорт назначения. Теперь я хочу получить кратчайшие рейсы (наименьшее количество остановок в пути) из аэропорта 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. И если я попробую другой способ, у меня возникнет проблема с петлей.
Надеюсь, вы, ребята, можете мне помочь. Спасибо заранее!