如果是下面这样的树,你想能得到什么顺序?a(b(c,d),e(f,g))

解决方案 »

  1.   

    你的例子中 NodeID=4 也没有紧跟在 NodeID=0 的后面。
      

  2.   

    select NodeID,ParentNodeID,DATA from table1 order by ParentNodeID,NodeID
    后面的order by 就是排序了。
      

  3.   

    lyre_lj(lyre)想的简单了。如果一个子结点的ID大于父结点的ID,你的结果就不符合ROBOT的原意。
      

  4.   

    lyre_lj(lyre)想的简单了。如果一个子结点的ID小于父结点的ID,你的结果就不符合ROBOT的原意。 
      

  5.   

    DB2支持递归,不过最好在建立关系时记录nodeid的层次。
      

  6.   

    如果仅仅是要求子结点总是在父结点的后面,但不必相临,下面的代码应该可以作到。我没有运行它,如果你能看明白,相信你能把它调试通过。create table #tmptable0 (OrderNo int, NodeID int, ParentNodeID int)
    create table #tmptable1 (OrderNo int, NodeID int)declare @PID int, @ONo int
    select  @PID=-1, @ONo=0while (true)
    begin    insert into #tmptable0 (OrderNo, NodeID, ParentNodeID) 
            select @ONo, NodeID, ParentNodeID from tablename where ParentNodeID=@PID
        
        insert into #tmptable1 (OrderNo,NodeID) 
            select @ONo, NodeID from tablename where ParentNodeID=@PID    if @PID=-1
            delete from #tmptable1 where NodeID=-1
        
        select top 1 @ONo=OrderNo+1, @PID=NodeID from #tmptable1    if @@RowCount=0 break    delete from #tmptable1 where NodeID=@PIDenddrop #tmptable1-- 用下面的语句可以得到顺序:子结点总是在父结点的后面。
    select a.NodeID, a.ParentNodeID, b.DATA 
        from #tmptable0 as a join tablename as b on a.NodeID=b.NodeID 
        order by a.OrderNo
      

  7.   

    drop #tmptable1
     ==>
    drop tbale #tmptable1
      

  8.   

    To: Nonono...
    显然你使用的方法是正确的,但是我想应该有比这更简单的方法?
        
      

  9.   

    你可以在表中增加一个字段Grade,用来表示级,排序的时候,按照Grade排序即可ID    ParentID   Grade
    1      NULL        1
    2      NULL        1
    3      1           2
    4      1           2
    5      3           3
    ......
    .....
      

  10.   

    ROBOTROBOT(),我这个方法不复杂,其中没有使用游标、效率不算低。没有用递归,不受层数的限制。看看别人是不是有基于你现在表结构下更简单的方法。
      

  11.   

    下面这样简单。呵呵create table #tmptable (OrderNo int, NodeID int)declare @NodeLevel int
    select  @NodeLevel=1insert into #tmptable (OrderNo, NodeID) 
        select @NodeLevel, NodeID from tablename where ParentNodeID=-1update #tmptable set @NodeLevel=0 where NodeID=-1while (true)
    begin    insert into #tmptable (OrderNo, NodeID) 
            select @NodeLevel+1, b.NodeID
                 from tablename as a, #tmptable as b
                 where a.NodeID = b.ParentNodeID and b.OrderNo = @NodeLevel    if @@Rowcount==0
            break    select  @NodeLevel = @NodeLevel + 1end
      

  12.   

    To nono...
       Thank you