这是一个家庭作业问题。我们通过动态构建SQL查询来解决它。但我们感兴趣的是,是否可以使用纯SQL。
简化所需内容: 有一个包含两列的表:源ID和目标ID。给定一个id和一个数字n,我们需要从给定的id中找到距离 small equal n的所有id。
澄清编辑:
将表视为代表Web链接。如果行(1,3)出现在表格中,则表示网页1具有指向网页3的链接
我们需要找到所有可通过n次点击或更少的起始网页访问的网页。
由于这是一个“好奇心”问题,请使用您喜欢的任何SQL实现。 “纯SQL”意味着适合“结构化查询样式”的所有内容。使用循环不被视为“纯SQL”(为了问题)。
答案 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并使用大量连接,就像您在动态生成的查询方法中所做的那样。