对CTE查询进行排序

时间:2012-09-30 20:49:07

标签: sql tsql

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

Hete是SQL Fiddle

请看sort sort,With Sort输出应该是这样的。

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

如果不能在子节点上进行排序那么它很好,但是至少控制PARENT节点的排序会很好。

2 个答案:

答案 0 :(得分:4)

修改

尝试this获取最新的问题/小提琴编辑。同样的想法,但又一个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架构以及到目前为止的查询,那将会非常棒。这允许其他人花费最少的时间进行设置。如果您必须扩展示例或提供if查询变体,它还有助于讨论。

答案 1 :(得分:0)

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