複数の親を持つツリー (またはダイグラフ) を SQL Server 2005 に実装する必要があります。いくつかの記事を読みましたが、それらのほとんどは、次のような一意のルートを持つ単一の親ツリーを使用しています。
-My PC
-Drive C
-Documents and Settings
-Program Files
-Adobe
-Microsoft
-Folder X
-Drive D
-Folder Y
-Folder Z
この例では、すべてがルート要素 (My PC) から派生しています。
私の場合、子は次のように複数の親を持つことができます。
G A
\ /
B
/ \
X C
/ \
D E
\ /
F
だから私は次のコードを持っています:
create table #ObjectRelations
(
Id varchar(20),
NextId varchar(20)
)
insert into #ObjectRelations values ('G', 'B')
insert into #ObjectRelations values ('A', 'B')
insert into #ObjectRelations values ('B', 'C')
insert into #ObjectRelations values ('B', 'X')
insert into #ObjectRelations values ('C', 'E')
insert into #ObjectRelations values ('C', 'D')
insert into #ObjectRelations values ('E', 'F')
insert into #ObjectRelations values ('D', 'F')
declare @id varchar(20)
set @id = 'A';
WITH Objects (Id, NextId) AS
( -- This is the 'Anchor' or starting point of the recursive query
SELECT rel.Id,
rel.NextId
FROM #ObjectRelations rel
WHERE rel.Id = @id
UNION ALL -- This is the recursive portion of the query
SELECT rel.Id,
rel.NextId
FROM #ObjectRelations rel
INNER JOIN Objects -- Note the reference to CTE table name (Recursive Join)
ON rel.Id = Objects.NextId
)
SELECT o.*
FROM Objects o
drop table #ObjectRelations
次のSETを返します。
Id NextId
-------------------- --------------------
A B
B C
B X
C E
C D
D F
E F
期待される結果セット:
Id NextId
-------------------- --------------------
G B
A B
B C
B X
C E
C D
D F
E F
関係 G->B が欠落していることに注意してください。これは、開始オブジェクトを要求し (最初からルート オブジェクトがわからないため、これも機能しません)、開始点として A を使用すると無視されるためです。 G→Bの関係。
したがって、このコードは私の場合は機能しません。これは、SINGLE-parent ツリーで明らかな開始オブジェクトを要求するためです (常にルート オブジェクトになります)。しかし、複数の親を持つツリーでは、複数の「ルート」オブジェクトを持つことができます (例のように、G と A は「ルート」オブジェクトであり、ルートは親 (先祖) を持たないオブジェクトです)。
だから私はここで立ち往生しています...開始オブジェクトを要求せず、ツリー全体を再帰的にトラバースするようにクエリを変更する必要があります。(Id, NextId) 実装でそれが可能かどうかはわかりません...何らかの種類のインシデントマトリックス、隣接マトリックスなどを使用してグラフのように保存する必要があるかもしれません ( http://willets.org/を参照) sqlgraphs.html )。
何か助けはありますか?皆さんどう思いますか?お時間をいただきありがとうございました=)
乾杯!