编辑
尝试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架构,以及您迄今为止所进行的查询,那将是非常好的选择。这允许其他人花费最少的时间进行设置。如果您不得不扩展样本或提供查询变体,那么它也有助于讨论。
谢谢,我用小提琴编辑我的帖子。 – highwingers
你试过我的查询吗?它似乎排序正确('通过sortpath')。 – RichardTheKiwi
理查德,我填充更多的数据到类别表中,它似乎像你建议的代码不起作用。这里是小提琴更多的数据 http://sqlfiddle.com/#!3/5abd8/1 – highwingers