Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL server树有限深度查询_Sql_Sql Server_Tree_B Tree - Fatal编程技术网

SQL server树有限深度查询

SQL server树有限深度查询,sql,sql-server,tree,b-tree,Sql,Sql Server,Tree,B Tree,我有一棵树,我正试图存储在数据库中。 现在每一排看起来像 ID, Child1, Child2, Child3, NodeValue 我将Child1、Child2和Child3作为引用ID的外键 我想做的是:给定一个节点,得到该节点及其所有子节点,我猜是一个子树。但是,我想将节点的深度限制在4到7之间 有人有什么建议吗 编辑: 下面是一个例子: ID C1 C2 C3 1 10 52 32 2 NULL NULL NULL 3 4 5 6 4

我有一棵树,我正试图存储在数据库中。 现在每一排看起来像

ID, Child1, Child2, Child3, NodeValue
我将Child1、Child2和Child3作为引用ID的外键

我想做的是:给定一个节点,得到该节点及其所有子节点,我猜是一个子树。但是,我想将节点的深度限制在4到7之间

有人有什么建议吗

编辑:

下面是一个例子:

ID   C1   C2   C3
1    10   52   32
2    NULL NULL NULL
3    4    5    6
4    2    NULL NULL
5    NULL NULL NULL
6    NULL NULL NULL
10   3    NULL NULL
52   NULL NULL NULL
32   NULL NULL NULL
如果我想在第1行查询深度为2,它将返回ID为1的行
、10、52、32和3,而不是2、4、5或6在SQLServer2005上使用递归CTE+

;WITH cte AS
 (
 SELECT ID, C1, C2, C3, 0 AS [Level]
 FROM dbo.test7
 WHERE ID = 1 -- @your root node
 UNION ALL
 SELECT t.ID, t.C1, t.C2, t.C3, c.[Level] + 1
 FROM dbo.test7 t JOIN cte c ON t.ID IN (c.C1, c.C2, c.C3)
 WHERE c.[Level] + 1 <= 2 --@your_depth
 )
 SELECT ID, C1, C2, C3
 FROM cte

演示

当您的ID为int时,您可以使用大于或小于的查询限制或操作,但节点的ID可能为10000000,并且仍然是ID为1的节点的子节点,因此执行基于ID的范围查询没有意义。您是否可以发布一些数据以供参考我发布了一个基本示例这将起作用,但在处理大树时,它不会有性能问题吗?根据我收集的信息,代码添加了一个额外的列并生成了一个额外的表。问题是如果我在1亿个节点树的根节点上调用它,但只需要两个级别。它仍然需要将级别字段添加到每一行,对吗?