@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))
あなたが本当に望むなら...あなたの木が本当に深いのでない限り、私はそれが必要だとは思わない.