次の構造でデータベース(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 このタスクは、命令型言語ではかなり明白です。結果のすべてのサブツリーですべての「ルートリーフ」パスを列挙し、これらのパスのセットを結合するだけで済みます。