2012-09-30 86 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獲得記錄(未分類),你通常會將它們轉換成某種對象層次結構。在那裏你可以非常快地構建層次結構,而不需要對真正的記錄進行排序。