Вариант на основе @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))
который затем рекурсивно добавляется...
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))
если вы действительно хотите... Я не думаю, что это необходимо, если только ваше дерево не действительно глубокое.
person
xanatos
schedule
02.07.2015