2017-04-24 31 views
0

我定义区的层次结构中的表所示hereSQL服务器 - 层次查询 - 订购结果

与它一起,我使用下面的查询:

WITH My_CTE(Zone, Parent, LEVEL , treepath) AS 
    (SELECT Zone_ID       AS Zone , 
      Parent_ID       AS Parent , 
      0         AS LEVEL , 
      ISNULL(CAST(Parent_ID AS VARCHAR(1024)),'') AS treepath 
     FROM [UWQ].[T_SYS_Zones] 
     WHERE Parent_ID IS NULL 

    UNION ALL 

    SELECT d.Zone_ID       AS Zone , 
      d.Parent_ID       AS Parent , 
      My_CTE.LEVEL + 1      AS LEVEL , 
      CAST(My_CTE.treepath + ' > ' + CAST(d.Parent_ID AS VARCHAR(1024)) AS VARCHAR(1024)) AS treepath 
      FROM [UWQ].[T_SYS_Zones] d 

    INNER JOIN My_CTE 
     ON My_CTE.Zone = d.Parent_ID 
    ) 

SELECT * 
    FROM My_CTE 
ORDER BY level , treepath; 

此查询会返回所需的信息,除了我需要它以不同的顺序,也就是说,每个区域都递归列出其子和儿童的孩子,直到用尽为止,然后才列出下一个兄弟

使用表中显示的数据,其结果应该是这样的:

Zone Parent LEVEL treepath 
0  NULL 0  
1  0  1   > 0 
2  1  2   > 0 > 1 
8  2  3   > 0 > 1 > 2 
9  2  3   > 0 > 1 > 2 
10  2  3   > 0 > 1 > 2 
12  2  3   > 0 > 1 > 2 
29  10  4   > 0 > 1 > 2 > 10 
30  10  4   > 0 > 1 > 2 > 10 
31  10  4   > 0 > 1 > 2 > 10 
32  10  4   > 0 > 1 > 2 > 10 
33  10  4   > 0 > 1 > 2 > 10 
34  10  4   > 0 > 1 > 2 > 10 
11  2  3   > 0 > 1 > 2 
35  11  4   > 0 > 1 > 2 > 11 
36  11  4   > 0 > 1 > 2 > 11 
37  11  4   > 0 > 1 > 2 > 11 
38  11  4   > 0 > 1 > 2 > 11 
39  11  4   > 0 > 1 > 2 > 11 
40  11  4   > 0 > 1 > 2 > 11 
41  11  4   > 0 > 1 > 2 > 11 
3  1  2   > 0 > 1 
... 

我试图与TreePath的领域没有成功形状玩。任何帮助将不胜感激。

回答

1

通过添加一个实际的序列,类似于你的树路径,你可以很容易地得到正确的顺序/嵌套。查看派生字段SEQ

@Top是可选的,它允许您从任何节点生成树。 NULL将是完整的层次结构。

您可能会注意到100000+Row_Number()这是为了确保正确的顺序,避免像1,10,11

错误订单例

Declare @YourTable table (Zone_ID int,Parent_ID int) 
Insert into @YourTable values 
(0, NULL),(1, 0),(2, 1),(8, 2),(9, 2),(10,2),(12,2),(29,10),(30,10),(31,10),(32,10),(33,10),(34,10),(11,2),(35,11),(36,11),(37,11),(38,11),(39,11),(40,11),(41,11),(3, 1)  

Declare @Top int = null  --<< Sets top of Hier Try 3 

;with cteP as (
     Select Seq = cast(100000+Row_Number() over (Order by Zone_ID) as varchar(500)) 
      ,Zone_ID 
      ,Parent_ID 
      ,Level=1 
      ,treepath = ISNULL(CAST(Parent_ID AS VARCHAR(1024)),'') 
     From @YourTable 
     Where IsNull(@Top,-1) = case when @Top is null then isnull(Parent_ID,-1) else Zone_ID end 
     Union All 
     Select Seq = cast(concat(p.Seq,'.',100000+Row_Number() over (Order by r.Zone_ID)) as varchar(500)) 
      ,r.Zone_ID 
      ,r.Parent_ID 
      ,p.Level+1 
      ,CAST(p.treepath + ' > ' + CAST(r.Parent_ID AS VARCHAR(1024)) AS VARCHAR(1024)) 
     From @YourTable r 
     Join cteP p on r.Parent_ID = p.Zone_ID) 
Select Zone_ID 
     ,Parent_ID 
     ,Level 
     ,treepath 
From cteP 
Order By Seq 

返回

enter image description here

+0

美丽解!!!!!谢谢你,先生。 – FDavidov

+0

@FDavidov快乐它帮助 –