2016-11-20 3 views
0

Ich bin eine Zeichenfolge für die Hierarchie eines Dokumenten-Management-System erstellen. Also, im Grunde der Ordner nach Ordner - bis hin zum Dokument.SQL zum Erstellen der Hierarchie Zeichenfolge - letzte Ebene fehlt

Zwei Probleme:

1. Die Datenbank listet alle der Ordner (und deren Eltern) in einer Tabelle, und alle Dokumente in einem anderen (und ihrem übergeordneten Ordner) 2. Abfrage ich verwende bisher fehlt die letzte Ordnerebene.

Ich verwende die folgende Abfrage:

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  

dann:

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

dann die absoluten Top-Level zu finden und legen Sie einen /:

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

dann den rekursiven Teil :

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 

Dies bringt dann meine Daten wie folgt aussehen:

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

Kann jemand empfehlen, wie die letzte Ordner-Ebene am Ende der Linie zu schließen, als f1010122 der letzte Ordner in der Kette ist und nach wie vor muss in der lineage Spalte enthalten sein? Und dann hatte ich auf der linken Seite eine Verknüpfung der Dokumente Tabelle, wo document_parent_id = id_object (f1010122).

Hope das macht Sinn. Ich verwende SQL Server 2014 Management Studio. Vielen Dank.

Antwort

1

Wenn Sie die aktuellen id_object am Ende seiner Linie zurückkehren wollen, dann wäre das ein ziemlich einfach sein:

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

Im Allgemeinen aber, könnte man wahrscheinlich erreichen, was Sie wollen in ein einzelner Schritt anstelle des mehrstufigen Prozesses, den Sie hier haben (der anscheinend einige Fehler enthält, möglicherweise, weil Sie versucht haben, Ihren Code neu zu erstellen, um ihn hier zu veröffentlichen: fehlerhafte Beispiele machen die Antwort schwieriger).

Das folgende Beispiel direkt von der Quelle [folders] Tabelle geht und gibt die Ausgabe, die Sie in einer SELECT Anweisung wollen (die Sie in eine Tabelle einfügen können, wenn Sie möchten):

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, erhalte ich Woher kommst du, bekomme aber eine "Typen stimmen nicht zwischen dem Anker und dem rekursiven Teil in der Spalte" Abstammung "der rekursiven Abfrage" rekursive_cte "" Fehlermeldung. haben es gegoogelt, aber scheinen nicht in der Lage zu sein, es zu lösen. Irgendwelche Ideen, und danke für Ihre Hilfe bis jetzt. – user3735855

+0

@ user3735855 Wenn Sie 'Select @@ VERSION 'wählen, in welcher Version sind Sie angemeldet? 2014? – mendosi

+0

@ user3735855 Es kann Ihnen helfen, die Definition von '[Ordner]' Tabelle in die Frage aufzunehmen. – mendosi

Verwandte Themen