在递归CTE下控制兄弟顺序?

Roy*_*mir 3 sql-server recursion sql-order-by common-table-expression

我有一个CTE查询,查找主要叶子和子叶子.但我无法控制2个兄弟姐妹之间的叶子选择顺序:

表中的每一行都声明为:

(childID INT ,parentID INT ,NAME NVARCHAR(30),location int)

哪里location是优先排序IFF他们是兄弟姐妹.

所以我有这种树结构:这些对具有位置优先级:

在此输入图像描述

例如 :

`a` ( location=1) should be before `f` (location=2)
`b` ( location=1) should be before `e` (location=2)
`d` ( location=1) should be **before** `c` (location=2)
Run Code Online (Sandbox Code Playgroud)

问题是,我必须首先 order by childID看到正确的结构(兄弟未分类).

但是 - 我order by应该怎么样才能看到正确的结构(&&兄弟分类)?

(在我的例子中:d应该来之前c)

这是生成所有树叶(未分类的兄弟)的工作查询

PS childID不是表示对排序任何东西.它只是一个占位符.正如我所说,2兄弟之间的位置是由location列.(这里,childId被排序,因为这是我插入行的顺序...

i-o*_*one 5

您可以计算CTE中树节点的路径并将其用于排序

;WITH CTE AS(
   SELECT childID, parentID, 0 AS depth, NAME , location,
         cast(location as varbinary(max)) path
   FROM   @myTable
   WHERE   childID = parentID 
    UNION ALL
    SELECT  TBL.childID, TBL.parentID,
           CTE.depth + 1 , TBL.name ,TBL.location,
           cte.path + cast(TBL.location as binary(4))
    FROM   @myTable AS TBL
            INNER JOIN CTE  ON  TBL.parentID = CTE.childID
    WHERE   TBL.childID<>TBL.parentID
)
SELECT depth, childID, parentID, location, REPLICATE('----', depth) + name
FROM CTE
ORDER BY path
Run Code Online (Sandbox Code Playgroud)