【发布时间】:2012-09-24 07:50:08
【问题描述】:
我有一个标准表,它定义了父、子类别关系......就像这样。
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 和 CLASSIC ASP 的行,这些是技术的最后一片叶子(子级)> 软件(父级),我想对任何给定父级(最后一个父级)的 LAST CHILDREN 进行排序。对于给定节点(最后一个子节点),我可以有多个父节点,我只关心使用“排序”列对最后一个子节点(叶节点)进行排序。
所以基本上“Classic Asp”应该在“Asp.Net”之前(最后一列是我图像中的 SORT 列)。
我的查询很好,它按预期返回结果...唯一的挑战是我想使用表中的 SORT 列对最后一个节点进行排序,最后一个节点可以有 3 或 4 个我想要排序的子节点,所有节点最后一个节点上方是它的父节点(它们的顺序已经正确)。
我想要这样的输出.... Internet > ISP's > CableVision (1) : Verizon (2) 如您所见 CableVision 和 Verizon 的排序值为 1 & 然后 2,现在假设我们有购物 > 优惠券 > Macys(0):Sears (2),同样的事情......我希望对 Macys & Sears 进行分类......而且它很漂亮 显然他们的父母是购物 > 优惠券。
@Richard aka cyberkiwi,在应用您的代码后,我对类别表的排序非常随机。输出低于
【问题讨论】:
-
我不同意它是随机的。 11,13,14 都是叶子。它们首先出现在分支之前(1,12 是分支),甚至在它们内部进行排序。同样,1_3 和 1_4 出现在 1_2_* 之前,因为它们是叶子,并且(1_3/1_4 是内部排序的)。如果您想得到满足您期望的答案,您需要学会首先告诉您的期望。从最后一张图片开始,不要只是告诉我们它是错误的。告诉我们它应该是什么样子。
-
如果我无法正确解释,我深表歉意。请查看 ID“1”及其排序值(即 1),它是父级,它应该是顶级父级类别。 ID“2”也应该在 ID“3”之前,如果您查看它们的排序列值,您会发现排序已关闭。
-
我有一种感觉,在您发布一张显示上一张图片中给出的确切样本所需的确切结果的图片之前,您不会看到对此问题采取任何行动。