0

我有一个表,它是点之间的路径列表。我想创建一个查询以从给定点返回带有 pointID 和范围(点数)的列表。但是花了一天时间试图解决这个问题,但没有去任何地方,有谁知道应该怎么做?(我正在为 MS-SQL 2005 编写此内容)

例子

-- fromPointID | toPointID |
---------------|-----------|
--           1 |         2 |
--           2 |         1 |
--           1 |         3 |
--           3 |         1 |
--           2 |         3 |
--           3 |         2 |
--           4 |         2 |
--           2 |         4 |

with PointRanges ([fromPointID], [toPointID], [Range])
 AS
 (
    -- anchor member
     SELECT [fromPointID],
            [toPointID],
            0 AS [Range]   
     FROM dbo.[Paths]
     WHERE [toPointID] = 1
     UNION ALL
     -- recursive members
     SELECT P.[fromPointID],
            P.[toPointID],
            [Range] + 1 AS [Range]   
     FROM dbo.[Paths] AS P
     INNER JOIN PointRanges AS PR ON PR.[toPointID] = P.[fromPointID]
   WHERE [Range] < 5 -- This part is just added to limit the size of the table being returned
 --WHERE P.[fromPointID] NOT IN (SELECT [toPointID] FROM PointRanges)
 --Cant do the where statment I want to because it wont allow recurssion in the sub query
 )
 SELECT * FROM PointRanges

--Want this returned
-- PointID | Range |
-----------|-------|
--       1 |     0 |
--       2 |     1 |
--       3 |     1 |
--       4 |     2 |
4

1 回答 1

0

Markus Jarderot 的链接对此给出了很好的答案。我最终尝试使用他的答案,并尝试用 C# 和 linq 重写我的问题,但它最终更像是一个数学问题而不是编码问题,因为我有一个包含数千个点的表,它们相互关联。这仍然是我感兴趣的事情,并试图通过阅读有关数学和图论的书籍来更好地理解,但如果其他人遇到这个问题,我认为 Markus Jarderot 的链接是你会找到的最佳答案。

于 2013-07-16T00:51:57.890 回答