2017-02-17 7 views
0

Ich habe eine Tabelle:Get Wert von rekursiven Tabelle

ParentNode | Node  | Children 
---------- | --------- | --------- 
NULL  | Parent_1 | true 
Parent_1 | Child_1 | true 
Child_1 | Child_2 | true 
Child_2 | Value1 | false 
NULL  | Parent_2 | true 
Parent_2 | Child_1 | true 
Child_1 | Value2 | false 

Ich brauche eine Funktion, die den Wert Pfad zurückgibt:

select Node, MyFunction(Node) as Path from myTable where Children = 'false' 

Das erwartete Ergebnis ist:

Node | Path 
------ | --------- 
Value1 | Parent_1/Child_1/Child_2 
Value2 | Parent_2/Child_1 

jede Ideen?

+1

haben Sie überhaupt etwas versucht? –

+0

Was definiert die Ordnung? –

Antwort

0

ich die Lösung für mein Problem mit diesem Code gefunden :

;WITH children AS 
(
    SELECT 
    ParentNode, 
    CAST(ISNULL(ParentNode + '/' ,'') + node AS VARCHAR(4000)) AS PathValue 
    FROM dashConfigurationSchema 
    WHERE node = 'Value1' 
UNION ALL 
    SELECT 
    t.ParentNode, 
    list= CAST(ISNULL(t.ParentNode + '/' ,'') + d.PathValue AS VARCHAR(4000)) 
    FROM dashConfigurationSchema t 
    INNER JOIN children AS d 
     ON t.Node = d.ParentNode 
) 

SELECT PathValue from children c WHERE ParentNode IS NULL 
2

Probieren Sie es aus, ich habe es nicht getestet.

WITH tree AS 
(
    SELECT c1.Node, c1.ParentNode, [level] = 1, path = cast(c1.Node as varchar(300)) 
    FROM dbo.[table] c1 
    WHERE c1.ParentNode = 'value 1' 
    UNION ALL 
    SELECT c2.Node, c2.ParentNode, [level] = tree.[level] + 1, 
      Path = Cast(tree.path + '/' + c2.Node as varchar(300)) 
    FROM dbo.[table] c2 INNER JOIN tree ON tree.Node = c2.ParentNode 
) 
SELECT tree.Node, tree.path 
FROM tree 
Order by path 
OPTION (MAXRECURSION 0) 
1

Sie zuerst eine Funktion, die sich selbst rekursiv aufruft definieren:

CREATE FUNCTION [dbo].[getFullPath] 
(
    @node_name nvarchar(50) 
) 
RETURNS nvarchar(max) 
AS 
BEGIN 
    declare @parent_name as nvarchar(50) 
    declare @full_path as nvarchar(max) 

    select 
    @parent_name = parentnode, 
    @node_name = node 
    from tree (nolock) 
    where node = @node_name 

    set @full_path = @node_name 

    if(isnull(@parent_name,'') <> '') 
    begin 
     set @full_path = dbo.getFullPath(@parent_name) + '\' + @full_path 
    end 

    return @full_path 
END 
GO 

es nur in einer Abfrage verwenden Dann:

select 
node, 
dbo.getFullPath(node) 
from tree 
+1

Ich würde das nicht als guten Ansatz empfehlen. Skalare Funktionen sind von einem Leistungsstandpunkt her gesehen sehr schlecht und das rekursive Aufrufen kann horrend sein. Ein rekursiver Cte wäre aus Performanceperspektive besser. Außerdem würde ich nicht vorschlagen, NOLOCK-Hinweise auf solche Anfragen zu werfen. Es kann weit unheimlicher sein als nur schmutzige Lesevorgänge. http://blogs.sqlsentry.com/aaronbertrand/bad-habits-nolock-everywhere/ –