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