我有这张代表层次结构的表:
childID parentID NAME siblingOrder
1 1 a 0
212 1 ab 1
112 1 ac 2
412 1 ad 3
-912 112 aca 0
结构是:
a
+----ab
+----ac
+---aca
+----ad
(该siblingOrder
列用于控制ab
, ac
,的顺序ad
)
我已经有了这个解决方案,它使用 siblingOrder
:
;WITH CTE AS(
SELECT childID, parentID, 0 AS depth, NAME , siblingOrder,
CAST(RIGHT('00000' + CAST(siblingOrder AS VARCHAR(6)), 6) AS VARCHAR(1024)) AS PATH
FROM @myTable
WHERE childID = parentID
UNION ALL
SELECT TBL.childID, TBL.parentID,
CTE.depth + 1 , TBL.name ,TBL.siblingOrder,
CAST(cte.Path + '.' + RIGHT('00000' + CAST(Tbl.siblingOrder AS VARCHAR(6)), 6)AS VARCHAR(1024) )
FROM @myTable AS TBL
INNER JOIN CTE ON TBL.parentID = CTE.childID
WHERE TBL.childID<>TBL.parentID
)
SELECT path,depth, childID, parentID, siblingOrder, REPLICATE('----', depth) + name
FROM CTE
ORDER BY PATH
所以order by
PATH
实际上做的工作:
问题:
问题是我必须(!)将值放入siblingOrder
以使其工作!
否则,例如:
如果我把0
所有siblingOrder
这些都放在结果中:
(是的,现在按路径排序 - 不起作用......)
我需要它aca
永远在ac
(我添加的唯一原因siblingOrder
是订购兄弟姐妹!)而且我不想siblingOrder
在不需要时强制添加
问题 :
是否可以增强查询以便siblingOrder
只影响兄弟姐妹?
我的意思是,如果我不关心兄弟姐妹的顺序(通过放置0
),我仍然aca
希望ac
您需要在路径中包含
parentID
和。childID
所以而不是你应该写
(那是在你的代码中的两个地方)
通过这种方式,您可以在需要的地方提供 siblingOrder。如果存在,它将覆盖子订单。如果不存在,孩子将按其 childID 排序。
没有 siblingOrder 的SQL Fiddle
MS SQL Server 2008 架构设置:
查询 1:
结果:
SQL Fiddle与 siblingOrder
MS SQL Server 2008 架构设置:
查询 1:
结果: