2009-08-16 8 views
2

Mit Hierarchie-Datentyp auf SQL 2008-Knoten in meiner Hierarchie so gehen:Reorder Knoten in SQL Hierarchie-Datentyp

value node 
36 /8/1/ 
38 /8/2/ 
34 /8/3/ 
40 /8/4/ 
42 /8/5/ 
44 /8/6/ 
46 /8/7/ 
48 /8/8/ 

Ich mag Knoten neu zu ordnen, so dass/8/3/und/8/1/Plätze tauschen. Irgendeine Idee, wie man das macht?

Die einzige Idee, die ich bisher habe, ist, dass ich alle Knoten auf einer Ebene in Array lade, sie so ordne, wie ich will, sie aus der Tabelle lösche und in sortierter Form einfüge.

+0

Bestrafen Sie Menschen nicht für Ihr armes Beispiel. Die Bestellung nach Wert ist basierend auf den von Ihnen angegebenen Daten gültig. Sie müssen korrigieren oder erklären, warum sonst. –

+0

Meine Frage besagt - REORDER NODES IN HIERARCHY. Sortiert die Bestellung nach Wert Knoten? – Vnuk

Antwort

4

gefunden Wenn (wie in Ihrem Beispiel) können Sie die hierarchyid Werte wissen Sie im Voraus manipulieren möchten, können Sie es direkt tun, zum Beispiel:

-- Place 1st node between 2nd and 3rd 
UPDATE yourTable SET node = CAST('/8/2.5/' AS hierarchyid) WHERE value = 36; 
-- Move 3rd node to 1st 
UPDATE yourTable SET node = CAST('/8/1/' AS hierarchyid) WHERE value = 34; 

Wenn Sie Ihre neuen Hierarchie-ID-Werte dynamisch abrufen müssen, werfen Sie einen Blick auf die Funktionen GetDescendant() und GetAncestor(). Mit, dass, würde das Beispiel wie folgt aussehen:

DECLARE @Parent hierarchyid, @Child1 hierarchyid, @Child2 hierarchyid 

-- Grab hierarchyids from 2nd and 3rd node 
SELECT @Child1 = node FROM yourTable WHERE value = 38; 
SELECT @Child2 = node FROM yourTable WHERE value = 34; 
-- Get the parent hierarchyid 
SELECT @Parent = @Child1.GetAncestor(1); 

-- Update 1st node to end up between 2nd and 3rd 
UPDATE yourTable SET node = @Parent.GetDescendant(@Child1, @Child2) WHERE value = 36; 
-- Update 3rd node to end up before 2nd 
UPDATE yourTable SET node = @Parent.GetDescendant(NULL, @Child1) WHERE value = 34; 

Beachten Sie, dass die hierarchyids bleiben nicht das gleiche in diesem Beispiel. Mindestens einer verwendet am Ende einen "Bruch" für seine Position (z. B. "/8/2.5/" anstelle von "/ 8/3 /").

+0

Oups, eine Minute zu spät ... –

+0

Ich wusste nicht, dass Sie die Hierarchie-ID so aktualisieren könnte. Das ist die Antwort auf mein Problem. Ich kann meine angenommene Antwort jetzt nicht rückgängig machen, aber ich werde deine akzeptieren. Vielen Dank – Vnuk