親と子のカテゴリの関係をソトレスする標準テーブルがあります...このように。
id, parent, catName, sort
そして、次のクエリを使用して再帰ツリーを作成します
;WITH cte AS (
SELECT 0 AS lvl, id, catName, parent,levels,sort,
CAST(id AS VARCHAR(128)) AS path
FROM CategoriesMap WHERE parent =0
UNION ALL
SELECT p.lvl + 1, c.id, c.catName, c.parent,c.levels,c.sort,
CAST(p.path + '_' + CAST(c.id AS VARCHAR) AS VARCHAR(128))
FROM CategoriesMap c
INNER JOIN cte p ON p.id = c.parent
)
SELECT
id,
catName AS catName,
lvl,
levels,
path,
parent,
sort
FROM cte
ORDER BY path
そして、出力は次のようになります。
値がASP.NETおよびCLASSICASPの行を探します。これらは、テクノロジ>ソフトウェア(親)の最後のリーフ(子)です。任意の親(最後の親)の最後の子を並べ替えます。特定のノード(最後の子)に対して複数の親を持つことができます。気になるのは、[並べ替え]列を使用して最後の子(リーフ)を並べ替えることだけです。
したがって、基本的に「Classic Asp」は、「Asp.Net」の前に配置する必要があります(最後の列は私の画像のSORT列です)。
私のクエリは問題なく、期待どおりの結果を返します...唯一の課題は、テーブルのSORT列を使用して最後のノードをSORTしたいことです。最後のノードには、並べ替える3つまたは4つの子を含めることができ、最後の上のすべてのノードを並べ替えることができます。ノードはその親です(すでに正しい順序になっています)。
このような出力が必要です...インターネット>ISP>CableVision(1):Verizon(2)ご覧のとおり、CableVisionとVerizonのソート値は1、次に2です。ここで、ショッピング>クーポン> Macys(0 ):シアーズ(2)、同じこと.... Macys&Searsを並べ替えてほしい...そして、両親がショッピング>クーポンであることは明らかです。
@Richard別名cyberkiwi、コードを適用した後、Categoriesテーブルの並べ替えは非常にランダムです。出力は以下です