2010-01-07 88 views
1

我有一個表,如下所示。遞歸t-sql查詢

ID ParentID Node Name Node Type 
------------------------------------------------------------------ 
525 524 Root Area Level 1 
526 525 C Area Level 2 
527 525 A Area Level 2 
528 525 D Area Level 2 
671 525 E Area Level 2 
660 527 B Area Level 3 
672 671 F Area Level 3 

如何寫一個遞歸t-sql查詢來生成下面的輸出?

輸出( 「根」 的輸出不是必需的節點):

Node ID 
----------------------- 
A 527 
A/B 660 
C 526 
D 528 
E 671 
E/F 672 

由於

+0

的SQL Server版本? – HLGEM 2010-01-07 21:46:10

+0

你會只需要兩個級別,或者可以有一個數據,其中b涉及到c? – HLGEM 2010-01-07 21:47:27

+0

sql server 2005.可能有超過2級 – stackoverflowuser 2010-01-07 21:49:45

回答

9

看看this page使用公共表表達式看看。這就是我會用什麼(假設你使用至少SQL Server 2005中)

下面是一個使用你的情況下,代碼示例:

WITH CTE (NodePath, ID) AS (
    SELECT 
     '/' + CAST(NodeName AS NVARCHAR(MAX)) AS NodePath, 
     ID 
    FROM TABLE 
    WHERE NodeName = 'Root' 

    UNION ALL 

    SELECT 
     CTE.NodePath + '/' + CAST(NodeName AS NVARCHAR(MAX)) AS NodePath, 
     TABLE.ID 
    FROM CTE 
    INNER JOIN TABLE ON TABLE.ParentId = CTE.ID 
) 

SELECT 
    NodeName, 
    ID 
FROM CTE 
+0

@Gabriel,+1,我只是寫了相同的示例代碼來更新我以前的答案=) – 2010-01-07 21:58:56

+0

是否有可能我可以做一些像「SELECT NodeName,ID FROM CTE」一些傳遞等級值的方法 – 2011-06-22 19:12:20