我在构建返回XML样式层次结构的查询时遇到了极大的困难。

我们有一个数据库表,其中包含我们网站的URL层次结构。该表包含以下列:ID,URL,DisplayName,ParentID,ItemOrder

父代ID在当前项目与其父代之间形成递归关系。该项目应位于层次结构中其父项的下方,并且还应该使用该项目顺序对层次结构中同一级别的项目进行排序。

我设法使一个递归查询起作用,因此它可以按顺序向下钻取层次结构,但是我也不能按项目顺序对其进行排序。

我当前的查询如下:

WITH Parents AS
(
SELECT MenuItemId, URL, ParentItemId, ItemOrder
FROM CambsMenu

UNION ALL

SELECT si.MenuItemId, si.URL, si.ParentItemId, si.ItemOrder
FROM CambsMenu si INNER JOIN Parents p
ON si.ParentItemId = p.MenuItemId
)

SELECT DISTINCT *
FROM Parents

最佳答案

兄弟姐妹的数量是已知值吗?是否知道等级数?
如果是这样,则可以对ItemOrder执行操作,以确保每个项目都有唯一的ItemOrder,然后按该值排序。

例如,假设任何项目的子级不能超过10个(ItemOrder范围为0到9),并且最多有5个级别。我现在要做的是,使第一个父项ItemOrder为其当前项订单的10000倍,其子项ItemOrder为其当前项ItemOrder的1000倍加上其父项ItemOrder,依此类推,每次删除0你往下走。

WITH Parents AS
(
SELECT MenuItemId,
    URL,
    ParentItemId,
    (ItemOrder * 10000) AS ItemOrder,
    10000 AS Multiplier
FROM CambsMenu
WHERE ParentItemId IS NULL

UNION ALL

SELECT si.MenuItemId,
    si.URL,
    si.ParentItemId,
    (p.ItemOrder + si.ItemOrder * p.Multiplier/ 10) as ItemOrder,
    (p.Multiplier / 10) as Multiplier
FROM CambsMenu si INNER JOIN Parents p
ON si.ParentItemId = p.MenuItemId
)

SELECT * FROM Parents ORDER BY ItemOrder


如果级别或子级的数目未知,则可以采用类似的方法,但是可以构建字符串ItemOrder,而不是构建数字ItemOrder,从而确保字符串'1.10.20'小于字符串'2.1'

关于sql - 在SQL Server中排序递归结果集,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2834156/

10-12 21:06