Tsql 按顺序递归CTE

Tsql 按顺序递归CTE,tsql,recursion,sql-order-by,common-table-expression,Tsql,Recursion,Sql Order By,Common Table Expression,我使用分层数据,并使用递归CTE列出如下项目: Eletronics Televisions Tube LCD Plasma Portable Electronic MP3 Players Flash CD Player Two Way Radios 我的问题是: 如何按照标题和层次结构排列此列表 像这样: Eletronics Portable El

我使用分层数据,并使用递归CTE列出如下项目:

Eletronics
    Televisions
        Tube
        LCD
        Plasma
    Portable Electronic
        MP3 Players
            Flash
        CD Player
        Two Way Radios
我的问题是:
如何按照标题和层次结构排列此列表

像这样:

Eletronics
    Portable Electronic
        CD Player
        MP3 Players
            Flash
        Two Way Radios
    Televisions
        LCD
        Plasma
        Tube

Tks

这是我几乎完成了我想要的工作的代码。 现在的问题是按描述订购

declare @tab table(
    id int identity(1,1)
    ,id_parent int
    ,name_product varchar(100)
)

insert into @tab
select null, 'Eletronics'
union all
select 1, 'Televisions'
union all
select 2, 'Tube'
union all
select 2, 'LCD'
union all
select 2, 'Plasma'
union all
select 1, 'Portable Electronic'
union all
select 6, 'MP3 Players'
union all
select 7, 'Flash'
union all
select 6, 'CD Player'
union all
select 6, 'Two Way Radios'

;WITH CTE (id,id_parent,name_product,LEVEL,SORTKEY)AS
(
    SELECT id, id_parent, name_product, 1, CAST(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, CAST(C.SORTKEY + CAST(t.name_product AS VARBINARY(MAX)) AS VARBINARY(MAX))
    FROM @tab t INNER JOIN CTE C
    ON t.id_parent = C.id
)

select * from cte order by SORTKEY
Tks

这是正确的CTE(仅适用于asc)


基于@onaiggac的变量(您可以使用他的数据:-))

这里的诀窍是使用

ROW_NUMBER() OVER (ORDER BY name_product)
进行“内部”排序。与@onaiggac一样,它随后被组成一个二进制
varbinary(max)

然后进行递归相加

C.SORTKEY + CAST(ROW_NUMBER() OVER (ORDER BY t.name_product) AS VARBINARY(MAX))
请注意,
ROW\u NUMBER()
将返回一个
bigint
。。。您可以先将其强制转换为
int
,然后再将其强制转换为
VARBINARY(MAX)
,如

CAST(CAST(ROW_NUMBER() OVER (ORDER BY name_product) AS INT) AS VARBINARY(MAX))

如果你真的想。。。我认为这是没有必要的,除非你的树很深。

我们如何在没有看到代码的情况下提供帮助?数据库软件及其版本的选择对可能的解决方案有很大影响。什么是‘cha runnin’?如果我只能订购特定级别,则可以。更改您的最终声明中的order by子句,以包括级别列,例如‘order by level,SORTKEY’。如果我这样做,孩子将不会跟随父母
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))
CAST(CAST(ROW_NUMBER() OVER (ORDER BY name_product) AS INT) AS VARBINARY(MAX))