SQL查询找到2点之间的最短路径

时间:2011-07-03 14:23:06

标签: sql-server

我的表格有三个字段:OriginDestinationDistance

如何编写查询以查找从始发地到目的地的最短路径?

 Origin     Destination        Distance 
-----------------------------------------
   A             B                 10
   B             C                 20
   C             E                 30
   B             F                 5
   F             E                 6

例如,我们想要从C到F的最短路线,答案是:

     C---->F
C---->B then B---->F

3 个答案:

答案 0 :(得分:0)

根据已经发表的评论,我建议你看看这个: Graph Algorithms with MapReduceMapReduce Links

答案 1 :(得分:0)

我必须解决类似的问题。只允许一跳。它有效,但解决方案非常繁琐。我不敢想你需要为你的问题编写什么程序。 SQL并不是真正针对您的问题。

从数据库读取数据并决定其他环境中的最佳路径(如LISP或Haskel)会更好。

所以我同意上述答案/评论,对你的问题没有简单的答案。

答案 2 :(得分:0)

我想可以使用递归CTE来完成。您可以找到以下代码以供参考。让我知道我是否想念任何东西。

DECLARE @x CHAR(5)= 'C';
DECLARE @y CHAR(5)= 'F';

WITH cte
     AS (
     SELECT CASE
                WHEN origin = @x
                THEN destination
                ELSE origin
            END destination,
            distance,
            CAST(RTRIM(CASE
                           WHEN origin = @x
                           THEN origin
                           ELSE destination
                       END) AS VARCHAR) AS rt
     FROM troute
     WHERE(origin = @x
           OR destination = @x)
     UNION ALL
     SELECT a.destination,
            a.distance + b.distance distance,
            CAST(RTRIM(b.rt)+'-'+a.origin AS VARCHAR) rt
     FROM troute a
          JOIN cte b ON a.origin = b.destination)
     SELECT id,
            destination,
            distance,
            RTRIM(rt)+'-'+RTRIM(@y)
     FROM
(
    SELECT ROW_NUMBER() OVER(ORDER BY distance) ID,
           *
    FROM cte
    WHERE destination = @y
) a
     WHERE a.ID = 1;