找到一定深度的所有链接

时间:2011-05-13 22:57:49

标签: sql

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

简化所需内容: 有一个包含两列的表:源ID和目标ID。给定一个id和一个数字n,我们需要从给定的id中找到距离 small equal n的所有id。

澄清编辑:
将表视为代表Web链接。如果行(1,3)出现在表格中,则表示网页1具有指向网页3的链接 我们需要找到所有可通过n次点击或更少的起始网页访问的网页。

由于这是一个“好奇心”问题,请使用您喜欢的任何SQL实现。 “纯SQL”意味着适合“结构化查询样式”的所有内容。使用循环不被视为“纯SQL”(为了问题)。

3 个答案:

答案 0 :(得分:1)

简短的回答是,对于任何“n”,它可能无法通过vanilla SQL实现。你要做的是探索所有链接的广度,直到给定的深度“n”。

答案 1 :(得分:1)

在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的记录,然后以递归方式连接到自身。

之后,就像过滤掉您不需要的所有记录一样简单。

答案 2 :(得分:1)

您无法使用关系代数或纯旧SQL来表达transitive closure,因此任何N的一般解决方案都是不可能

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