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被排序,因为这是我插入行的顺序...
您可以计算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)
| 归档时间: |
|
| 查看次数: |
2020 次 |
| 最近记录: |