2

期待どおりに出力を返すCTERecursiveクエリがありますが、並べ替えを制御できれば便利です。たとえば、テーブルのカスタムSORT列を使用してPARENTノードを並べ替えたいと思います...可能であれば、SORT列を使用してParentCategoriesの下のノードも並べ替えます。

HeteはSQLフィドルです

ソート列を見てください。ソート出力は次のようになります。

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

子ノードでの並べ替えが不可能な場合は問題ありませんが、少なくともPARENTノードの並べ替えを制御することをお勧めします。

4

2 に答える 2

4

編集

最新の質問/フィドル編集のためにこれを試してください。同じ考えですが、再帰部分でNULLソートを処理するのを忘れたため、もう1つISNULLです。

;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スキーマと、これまでに使用したクエリを準備できれば非常に便利です。これにより、他の人はセットアップに最小限の時間を費やすことができます。また、サンプルを拡張したり、whatifクエリバリアントを提供したりする必要がある場合のディスカッションにも役立ちます。

于 2012-09-30T22:06:14.840 に答える
0

あなたはあなたの質問に対する答えを見つけることができますが、私は質問の全体的な考えが間違っていると思います。DBからレコード(ソートされていない)を取得したら、通常、それらをある種のオブジェクト階層に変換します。そこで、レコードを実際にソートする必要なしに、非常に迅速に階層を構築できます。

于 2015-06-27T08:45:58.330 に答える