2012-09-30 84 views
1

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

荷特是SQL Fiddle

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

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

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

回答

3

编辑

尝试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(最大)使得最终结果一个varchar(最大值)。一个演员会做。对于未来的SQL问题,如果您可以准备SQLFiddle架构,以及您迄今为止所进行的查询,那将是非常好的选择。这允许其他人花费最少的时间进行设置。如果您不得不扩展样本或提供查询变体,那么它也有助于讨论。

+0

谢谢,我用小提琴编辑我的帖子。 – highwingers

+0

你试过我的查询吗?它似乎排序正确('通过sortpath')。 – RichardTheKiwi

+0

理查德,我填充更多的数据到类别表中,它似乎像你建议的代码不起作用。这里是小提琴更多的数据 http://sqlfiddle.com/#!3/5abd8/1 – highwingers

0

虽然你可以找到答案或你的问题,但我认为这个问题的整个想法是错误的。一旦你从DB获得记录(未分类),你通常会将它们转换成某种对象层次结构。在那里你可以非常快地构建层次结构,而不需要对真正的记录进行排序。