try this:
;WITH Paths AS (
-- Anchor query: get first step
SELECT CAST(CONCAT(Source, '->', Destination) AS VARCHAR(MAX)) AS Path,
Destination, Fare,
IIF(Destination = 'C', 1, 0) AS Terminate
FROM mytable
WHERE Source = 'A'
UNION ALL
-- Recursive part: get next step
SELECT CAST(CONCAT(Path, '->', t.Destination) AS VARCHAR(MAX)) AS Path,
t.Destination, Fare = t.Fare + p.Fare,
IIF(t.Destination = 'C', 1, 0) AS Terminate
FROM mytable AS t
JOIN Paths AS p ON t.Source = p.Destination
WHERE p.Destination <> 'C'
)
SELECT Path, Fare
FROM (
SELECT Path, Fare,
RANK() OVER (ORDER BY Fare) AS rnk
FROM Paths
WHERE Terminate = 1) AS t
WHERE t.rnk = 1
Dies ist eine Art ein Brute-Force-Methode: Sie verwendet einen rekursiven CTE, um alle möglichen Pfade zu erhalten. Dann können wir mit RANK
diejenige (n) auswählen, die den Mindestpreis haben.
Demo here
Ich bin nicht sicher, dass Sie in der Lage sein werden, Informationen über einzelne SQL-Abfrage –
Sie benötigen ein [** Reiseproblem **] zu erhalten (https://en.wikipedia.org/wiki/Travelling_salesman_problem) -Algorithmus –
Tatsächlich benötigen Sie einen Single-Source-Algorithmus für den kürzesten Pfad, wie den Dijkstra-Algorithmus. Sie würden die Tarife als Kantenwerte verwenden. Der TSP wird nicht funktionieren, da es Ihnen die Route mit den geringsten Kosten geben würde, ALLE Städte zu besuchen, nicht nur die zwei, an denen Sie interessiert sind. – JerryM