2016-11-20 2 views
0

文書管理システムの階層の文字列を作成しています。だから、基本的には、フォルダごとの内訳 - ドキュメントまでのすべての方法です。階層構造を構築するSQL - 最後のレベルが見つからない

2つの問題:私は使用しています

1.データベースリスト1つのテーブル内のフォルダ(とその親)のすべて、および他の文書(とその親フォルダ)のすべて 2.クエリこれまでのところ、最終的なフォルダレベルを逃しています。その後、

select a.id_object, a.name, a.id_parent, 
b.name as 'parent_name', b.id_parent as 'parent id' 
into #a 
FROM [folders] a left join [folders] b on b.id_object = a.id_parent  

私は、次のクエリを使用しています

INSERT INTO Tree2([id_parent],[parent_name],[id_object],[object_name]) 
select id_parent, [parent_name],id_object, [name] from #a 

は絶対トップレベルを見つけ、/挿入するには:

UPDATE Tree2 SET Lineage='/', Depth=0 WHERE parent_name Is Null 
UPDATE Tree2 SET Full_Lineage='/', Depth=0 WHERE parent_name Is Null 

そして、再帰部分を:

WHILE EXISTS (SELECT * FROM Tree2 WHERE Depth Is Null) 
UPDATE T SET  T.depth = P.Depth + 1, 
     T.Lineage = P.Lineage + T.id_parent + '/' , 
     FROM Tree2 AS T 
INNER JOIN Tree2 AS P ON (T.id_parent=P.id_object) 
WHERE P.Depth>=0 
AND T.Depth Is Null 
AND P.Lineage Is Not Null 

これは、このように見えるように自分のデータをもたらします:まだ、誰もがf1010122がチェーン内の最後のフォルダであるとして、系統の終わりに、最終的なフォルダレベルを含める方法をお勧めでき

Node id_parent  id_object object_name depth lineage  
100  f10101  f1010122  blah blah  5  F00/f0/f100/f1000/f10101 

lineage列に含める必要がありますか?そして、私は文書表の左結合を意図していました。ここではdocument_parent_id = id_object (f1010122)です。

希望はこれが理にかなっています。私はSQL Server 2014 Management Studioを使用しています。ありがとうございました。

答えて

1

あなたはそれがかなりシンプルになり、その系統の終わりに現在のid_objectを返したい場合は:一般的に

Select node, id_parent, id_object, object_name, depth, lineage, 
    full_path = lineage + id_object + '/' 
    From Tree2; 

、しかし、あなたはおそらくあなたがしたいしているものを達成できましたここにある複数ステップのプロセスではなく、1つのステップ(これはいくつかのバグを含んでいるようです。バグのあるサンプルはこれに答えるためにコードを再作成しようとしたからです)。

次のサンプルは、ソース[folders]表から直接行き、あなたは(あなたがしたい場合は、テーブルに挿入できます)SELECT文で希望の出力を返します。

With recursive_cte As (
    Select id_object, name, id_parent, 
     depth = 0, 
     lineage = Convert(varchar(128), '/') 
     From [folders] 
     Where id_parent Is Null 
    Union All 
    Select child.id_object, child.name, child.id_parent, 
     depth = parent.depth + 1, 
     lineage = Convert(varchar(128), parent.lineage + child.id_parent + '/') 
     From [folders] As child 
     Join recursive_cte As parent on child.id_parent = parent.id_object) 
Select id_object, name, id_parent, depth, lineage, 
    full_path = lineage + id_object + '/' 
    From recursive_cte; 
+0

ありがとうの@mendosi、私が取得しますしかし、あなたはどこから来ているのですか? "recursive_cte" "エラーメッセージの列" lineage "にアンカーと再帰的部分の型が一致しません。それを見つけたが、それを解決することはできないようだ。任意のアイデア、そしてこれまであなたの助けに感謝します。 – user3735855

+0

@ user3735855 '@@ VERSION'を選択した場合、あなたはどのバージョンですか? 2014? – mendosi

+0

@ user3735855質問に '[folders]'テーブルの定義を含めると役に立ちます。 – mendosi

関連する問題