我有一个CTE递归查询,它按预期返回输出,但是如果我可以控制排序会很好。例如,我想通过在表中使用自定义SORT列对PARENT节点进行排序...并且IF可能使用SORT列对父类别下的节点进行排序。
Hete是SQL Fiddle
请看sort sort,With Sort输出应该是这样的。
Appliances < -- Parent
Dryers
Washers
Toys < -- Parent
Furniture < -- Parent
如果不能在子节点上进行排序那么它很好,但是至少控制PARENT节点的排序会很好。
答案 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获取记录(未排序)后,通常会将它们转换为某种对象层次结构。在那里,您可以非常快速地构建层次结构,而无需对记录进行实际排序。