Вы можете достичь желаемого результата, используя «Рекурсивно с предложением».
Таблица:
create table test(
route_id int,
pointA char,
pointB char,
cost int
);
Значения:
insert into test values(1 ,'A','B',10),
(2 ,'L','G',10),
(2 ,'G','C',20),
(2 ,'C','F',15),
(2 ,'F','E',13)
Рекурсивный запрос:
WITH RECURSIVE routecost AS (
SELECT pointA, pointB ,cost /* non recursive part */
FROM test
WHERE pointA = 'G'
and route_id = 2
UNION ALL
SELECT b.pointA, a.pointB, a.cost + b.cost /* recursive part */
FROM test a
JOIN routecost b ON(a.pointA = b.pointB)
where a.route_id = 2
)
SELECT * FROM routecost
where pointB = 'E'
Объяснение:
- Сначала отфильтруйте запрос с pointA и route_id в нерекурсивной части.
- Затем в рекурсивной части присоедините его, как показанов запросе и добавьте стоимость
- Я получаю b.pointA (в нерекурсивной части) каждый раз, потому что нам нужна начальная точка.
- Затем, наконец, я фильтрую ее до значения pointB, чтобы получить требуемый результат.
Ссылка: Рекурсивно с предложением