建议看看这个帖子,邹建回复的,与此问题有共性。
http://community.csdn.net/Expert/TopicView.asp?id=4142266这个方法关键是要计算出累积编号,有了累积编号了,就可以找到任意级了。
你的表上增加一个冗余列,
id  pid 类别,累积编号
01  01  X1    0101
02  01  X2    0102
这个累积编号,需要用算法来实现。

解决方案 »

  1.   

    谢谢,我也发现其实邹大侠的那个关键就是产生了一个sid,他的那个例子中的sid是根据id来得出的,但恰恰是正向排序,我现在恰恰要反过来,我愚笨的还想套用他的办法用postTime来产生这个sid,不过你也知道time的数据太长了,没有办法套用。所以我想不出来如何做到:
    某一级的id是越变越大但却要逆序出来。我还想过一招但不会写,也不知道可不可行,就是一个分支一个分支的插入,sid的值构造为插入的顺序值。(不知道我这句话说清楚了没有)。因为我发现邹建和另一个大侠的(好像就是你的吧),写过的遍历都是先按层(级)插,再对其子做遍历。如果能一颗子树一颗子树的插就可以解决了,插的时候就可以按order by postTime desc的顺序来,产生的sid正好就是从小到大了。
      

  2.   

    qufusongyu(元秋):你看看我这样行不行:
    在建表的时候就构造一冗余列tid.(tid=100-id)
    再按照邹建的办法针对tid去构造sid,好像正好可以满足。
    办法有点傻。
      

  3.   

    呵呵~我试验成功了,不用设冗余列,直接按如下写即可:
    CREATE function f_GetChild(@id int)
    returns @re table([id] int,[level] int,sid varchar(8000))
    as
    begin
    declare @l int
    set @l=0
    insert @re select SubID,@l,right((10000+(10000-SubID)),4)
    from my_bbsPost where parentSubID=@id
    while @@rowcount>0
    begin
    set @l=@l+1
    insert @re select a.SubID,@l,b.sid+right((10000+(10000-a.SubID)),4)
    from my_bbsPost a,@re b
    where a.parentSubID=b.[id] and b.[level]=@l-1
    end
    return
    end
    就是把邹建的10000+subID改成10000+(10000-subID)而已。