編輯
嘗試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