变基于@onaiggac(你可以用自己的数据: - ))
;WITH CTE (id, id_parent, name_product, LEVEL, SORTKEY) AS
(
SELECT id, id_parent, name_product, 1,
CAST(ROW_NUMBER() OVER (ORDER BY name_product) AS VARBINARY(MAX))
FROM @tab where id_parent is null -- Starts with the first level
UNION ALL
SELECT t.id, t.id_parent, t.name_product, C.LEVEL + 1,
C.SORTKEY + CAST(ROW_NUMBER() OVER (ORDER BY t.name_product) AS VARBINARY(MAX))
FROM @tab t
INNER JOIN CTE C ON t.id_parent = C.id
)
SELECT id, id_parent, REPLICATE(' ', LEVEL - 1) + name_product, LEVEL, SORTKEY FROM CTE ORDER BY SORTKEY
这里的诀窍是使用
ROW_NUMBER() OVER (ORDER BY name_product)
做“内”排序。作为@onaiggac,这是然后在二进制varbinary(max)
CAST(ROW_NUMBER() OVER (ORDER BY name_product) AS VARBINARY(MAX))
被然后递归additioned组成...
C.SORTKEY + CAST(ROW_NUMBER() OVER (ORDER BY t.name_product) AS VARBINARY(MAX))
注意ROW_NUMBER()
将返回bigint
......你可以将其转换为int
它铸造VARBINARY(MAX)
,像
CAST(CAST(ROW_NUMBER() OVER (ORDER BY name_product) AS INT) AS VARBINARY(MAX))
,如果你真的想之前......我不认为这是necess ary除非你的树是真的深。
我们怎样才能在没有看到代码的情况下提供帮助 – Bort 2012-08-16 00:56:52
数据库软件及其版本的选择对可能的解决方案有相当大的影响。 What'cha runnin'? – HABO 2012-08-16 01:24:01
[CTE的真实递归?]的可能的重复?(http://stackoverflow.com/questions/11636420/a-real-recursion-with-cte) – 2012-08-16 04:24:46