文書管理システムの階層の文字列を作成しています。だから、基本的には、フォルダごとの内訳 - ドキュメントまでのすべての方法です。階層構造を構築する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を使用しています。ありがとうございました。
ありがとうの@mendosi、私が取得しますしかし、あなたはどこから来ているのですか? "recursive_cte" "エラーメッセージの列" lineage "にアンカーと再帰的部分の型が一致しません。それを見つけたが、それを解決することはできないようだ。任意のアイデア、そしてこれまであなたの助けに感謝します。 – user3735855
@ user3735855 '@@ VERSION'を選択した場合、あなたはどのバージョンですか? 2014? – mendosi
@ user3735855質問に '[folders]'テーブルの定義を含めると役に立ちます。 – mendosi