0

次の構造でデータベース(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

PS このタスクは、命令型言語ではかなり明白です。結果のすべてのサブツリーですべての「ルートリーフ」パスを列挙し、これらのパスのセットを結合するだけで済みます。

4

0 に答える 0