2016-11-20 8 views
0

Я строю строку для иерархии системы управления документами. Итак, в основном папка по разбивке по папкам - вплоть до документа.SQL для построения строки иерархии - последний уровень отсутствует

две проблемы:

1.The списки базы данных все из папок (и их родителей) в одной таблице, и все документы в другой (и их родителей) папку 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 

Это тогда приносит свои данные, чтобы выглядеть следующим образом:

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

Может кто-нибудь подскажет, как включить конечный уровень папок на конце линии, а f1010122 последняя папка в цепи и до сих пор необходимо включить в колонку 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; 

В целом, хотя, вероятно, можно добиться того, что Вы желаете, чтобы в один шаг, а не многоэтапный процесс, который у вас здесь (что, кажется, имеет некоторые ошибки в нем, возможно, потому, что вы пытались воссоздать свой код с целью его публикации здесь: багги-выборки больше отвечают).

В следующем примере идет непосредственно из таблицы источника [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

Thankyou @mendosi, я получаю откуда вы пришли, однако я получаю «Типы не совпадают между якорем и рекурсивной частью в столбце« lineage »рекурсивного запроса« recursive_cte »« сообщение об ошибке. имеют googled, но, похоже, не могут его решить. Любые идеи, и спасибо за вашу помощь до сих пор. – user3735855

+0

@ user3735855 Если вы используете 'Select @@ VERSION', в какой версии вы работаете? 2014? – mendosi

+0

@ user3735855 Это может помочь вам включить определение '[folders]' table в вопрос. – mendosi