Sql 找到一定深度的所有链接

Sql 找到一定深度的所有链接,sql,Sql,这是一道家庭作业题。我们通过动态构建SQL查询解决了这个问题。但我们感兴趣的是,是否可以使用纯SQL 所需内容的简化: 有一个表有两列:源id和目标id。给定一个id和一个数字n,我们需要找到距离给定id小于等于n的所有id 澄清编辑: 将该表视为表示web链接的表。如果表中出现行(1,3),则表示网页1有一个指向网页3的链接 我们需要找到所有的网页,可以从一个开始的网页与n点击或更少。 因为这是一个“好奇”的问题,所以请使用您喜欢的任何SQL实现。 “纯SQL”指符合“结构化查询风格”的所有

这是一道家庭作业题。我们通过动态构建SQL查询解决了这个问题。但我们感兴趣的是,是否可以使用纯SQL

所需内容的简化: 有一个表有两列:源id和目标id。给定一个id和一个数字n,我们需要找到距离给定id小于等于n的所有id

澄清编辑:
将该表视为表示web链接的表。如果表中出现行(1,3),则表示网页1有一个指向网页3的链接
我们需要找到所有的网页,可以从一个开始的网页与n点击或更少。

因为这是一个“好奇”的问题,所以请使用您喜欢的任何SQL实现。
“纯SQL”指符合“结构化查询风格”的所有内容。使用循环并不被认为是“纯粹的SQL”(为了回答这个问题)。

简单的回答是,对于任何“n”,都不可能通过普通SQL实现。您试图做的是从广度上探索所有链接,直到给定深度“n”

在MS SQL 2005+中,可以使用递归查询

;WITH RecursiveTbl AS
(
  SELECT WL.SouriceID, WL.DestinationId, 0 AS level
  FROM WEBLINKS WL
  WHERE WL.SouriceID = @your_top_level_id

  UNION ALL

  SELECT WL.SouriceID, WL.DestinationId, RWL.level + 1 AS level
  FROM RecursiveTbl RWL
  JOIN WEBLINKS WL ON RWL.DestinationId = WL.SourceID
)
SELECT * FROM RecursiveTbl WHERE level BETWEEN 1 AND 3;
查询最初选择具有相同SourceID的记录,然后递归地连接到自身

之后,只需过滤掉所有不需要的记录即可

您无法使用关系代数或纯旧SQL进行表示,因此不可能为任何N提供通用解决方案


您最好在“编译时”选择N并使用大量联接,就像您在动态生成查询方法中所做的那样。

您的问题不是很清楚。距离给定id n的所有id是什么意思?你的桌子代表某种树吗?你能举一个这样的表的例子吗?它有一个样本数据,清楚地显示了什么是
N-deep
?…你所说的纯SQL是什么意思?。。。您使用的是什么数据库管理系统?