2

我有一个 CTE 递归查询,它按预期返回输出,但是如果我可以控制排序会很好。例如,我想通过使用表中的自定义 SORT 列对 PARENT 节点进行排序......并且如果可能,也可以使用 SORT 列对父类别下的节点进行排序。

Hete 是SQL Fiddle

请看排序列,排序输出应该是这样的。

 Appliances < -- Parent
   Dryers
   Washers
 Toys < -- Parent
 Furniture < -- Parent

如果不可能对子节点进行排序,那么它很好,但至少控制父节点的排序会很好。

4

2 回答 2

4

编辑

试试这个最新的问题/小提琴编辑。同样的想法,但多了一个 ISNULL,因为我忘了在递归部分处理 NULL 排序。

;WITH cte AS (
    SELECT 0 AS lvl, catcode, catName, parentID,
        CAST(catCode AS VARCHAR(max)) AS Path,
        CAST(isnull(sort,9999) AS VARCHAR(max)) AS SortPath
    FROM categories WHERE parentID =0
    UNION ALL
    SELECT p.lvl + 1, c.catCode, c.catName, c.parentID,
        p.Path + '_' + CAST(c.catCode AS VARCHAR(max)),
        p.SortPath + '_' + CAST(isnull(c.sort,9999) AS VARCHAR(max))
    FROM categories c
    INNER JOIN cte p ON p.catCode = c.parentID
)
SELECT 
    catCode, 
    catName AS catName, 
    lvl,
    Path,
    parentID
FROM cte 
ORDER BY SortPath

注意:一系列字符串连接中的单个 varchar(max) 使最终结果为 varchar(max)。一个演员就可以了。

仅供参考 - 对于未来的 SQL 问题,如果你能准备一个SQLFiddle模式,以及到目前为止你有什么查询,那就太好了。这允许其他人在设置上花费最少的时间。如果您必须扩展示例或提供 what if 查询变体,它也有助于讨论。

于 2012-09-30T22:06:14.840 回答
0

虽然你可以找到你的问题的答案,但我认为这个问题的整个想法是错误的。从 DB 中获取记录(未排序)后,通常会将它们转换为某种对象层次结构。在那里,您可以非常快速地构建层次结构,而无需对记录进行排序。

于 2015-06-27T08:45:58.330 回答