Sql 如何为分层数据创建WHERE NOT IN?
我有一个表,它是点之间的路径列表。我想创建一个查询来返回一个列表,其中包含给定点的pointID和rangenumber。但是我花了一天的时间试图弄明白这一点,却没有去任何地方,有人知道应该怎么做吗?我为MS-SQL 2005写这篇文章Sql 如何为分层数据创建WHERE NOT IN?,sql,sql-server-2005,hierarchical-data,hierarchical-query,Sql,Sql Server 2005,Hierarchical Data,Hierarchical Query,我有一个表,它是点之间的路径列表。我想创建一个查询来返回一个列表,其中包含给定点的pointID和rangenumber。但是我花了一天的时间试图弄明白这一点,却没有去任何地方,有人知道应该怎么做吗?我为MS-SQL 2005写这篇文章 Markus Jarderot的链接给出了一个很好的答案。最后我试着用他的答案,也试着用C和linq重写我的问题,但它最终更多的是一个数学问题,而不是一个编码问题,因为我有一个表,其中有几千个点是相互关联的。这仍然是我感兴趣并试图通过阅读数学和图论方面的书籍来更
Markus Jarderot的链接给出了一个很好的答案。最后我试着用他的答案,也试着用C和linq重写我的问题,但它最终更多的是一个数学问题,而不是一个编码问题,因为我有一个表,其中有几千个点是相互关联的。这仍然是我感兴趣并试图通过阅读数学和图论方面的书籍来更好地理解的东西,但如果其他人遇到这个问题,我认为Markus Jarderot的链接是你能找到的最佳答案。我不确定我是否理解你需要的东西,是否需要与给定点相关的所有点及其距离?
-- 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 |