查找存储在数据库中的树的一部分中从根到叶的所有路径

时间:2012-09-04 05:29:30

标签: sql-server tree

假设存储在数据库(MS SQL Server)中的树在以下结构中

CREATE TABLE Nodes(
   NodeId int PRIMARY KEY, 
   NodeValue varchar(50));

CREATE TABLE Adjacencies(
   ParentId int REFERENCES Nodes(NodeId), 
   -- every adjacence is unique for specified child node
   ChildId int PRIMARY KEY REFERENCES Nodes(NodeId), 
   Weight int);

现在我们有一个表 Foo ,它使用了这个树中的值(关系多对多

CREATE TABLE Foo(FooId int PRIMARY KEY);
CREATE TABLE Foo_Nodes(
   FooId int REFERENCES Foo(FooId), 
   NodeId int REFERENCES Nodes(NodeId),
   CONSTRAINT PK_Foo_Nodes PRIMARY KEY (FooId,NodeId))

现在对于指定的 FooId ,我们有树节点的子集,(在 FooNodes 表中),我们的任务是从该子集中查找所有“根叶”路径(这个子集不是必需的仍然是树,而是它将是一组子树)。

使用SQL语法有最好的方法吗?

例如,路径{{1,2,3}, {1,4}, {5,6}, {9}}的结果表可以具有这样的结构

PathId    NodeId    Level
---------------------------
1         1         1       |
1         2         2       | first path
1         3         3       |
2         1         1           | second path
2         4         2           |
3         5         1                | third path
3         6         2                |
4         9         1                      | fourth path

P.S。在命令式语言中,此任务非常明显:我们只需要枚举所有结果子树中的所有“根叶”路径,并将这些路径组合在一起。

0 个答案:

没有答案