Mam problem z uzyskaniem oświadczenia, aby uzyskać wszystkie międzylądowania na lot.Jak uzyskać najkrótszą ścieżkę w Flightroutes-Table
Mam stół z lotkami jak poniżej, który ma lotnisko-źródło i lotnisko docelowe. Teraz chcę uzyskać najkrótsze loty (najmniejsze międzylądowania) z lotniska A na lotnisko B, nie ma bezpośredniej trasy od A do B, więc muszę połączyć kilka tras razem.
Tak na przykład, jeśli chcę, aby przejść od 18 do 1403 chcę uzyskać trasy
(18 > 24 | 24 > 87 | 87 > 1403)
i nie
(18 > 24 | 24 > 87 | 87 > 99| 99 > 1403)
Oto dane testowe
src_apid | dst_apid
---------+----------
18 | 24
24 | 87
87 | 99
87 | 1403
99 | 18
99 | 1403
Moja próba wygląda następująco:
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;
Ale w ten sposób otrzymuję tylko wszystkie trasy, które rozpoczynają się od źródła-port lotniczy 18. A jeśli spróbuję inaczej, dostaję problem z pętlą.
Mam nadzieję, że możesz mi pomóc. Z góry bardzo dziękuję!
https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm –
[Ta odpowiedź] (http://stackoverflow.com/a/39119303/5089204) to serwer SQL składni, ale może wskazać ci drogę. Główna sztuczka polega na noszeniu rosnącego sznurka ze wszystkimi odwiedzonymi stacjami i zatrzymywaniu rekursji, jeśli jedno miejsce zostanie ponownie odwiedzone. – Shnugo