http://expert.csdn.net/Expert/topic/1375/1375432.xml?temp=.6925318
--------
select *,dbo.fn_32gettopclass(Tc_id,default,2,default) from treeclass 层次用,分隔。

解决方案 »

  1.   

    建议在表中 增加 level 层  与  是否明细  的字段  用触发器完成赋值金蝶K/3是这样做的
      

  2.   

    大家看看,能不能用简单的sql实现?我没仔细想,海GG,J老师有办法吗?
      

  3.   

    不会。我只会SQL SERVER,我那知道是不是特殊数据库的,且层次又不定,不想它。
      

  4.   

    急啊!
    请问,如何在sql server中,让id 自动增量啊!
    tbl_dep
    dep_id       dep我想让填dep的时候,dep_id 能自己赋值!
    怎么做啊,帮个忙啊!
      

  5.   

    楼上用identity属性呀!
    create table tbl_dep (dep_id int identity(1,1),dep varchar(100))
    go知道了就不要回复了!
      

  6.   

    我来出一个简单的相关问题("简化"你的需求),
    我认为在SQL力所能及的情况下,下面的问题相对更合理一些:问题: 查询所有叶子节点,及其临近的 4 代祖先?答案:应该不难看出下面SQL语句的规律,
    你可根据"指定"的层次另外编程序(循环或递归)构造这个动态SQL,希望对你有一些启发:select
    id
    ,parentid
    ,(select parentid
        from tree
       where id = t.parentid
     )
    ,(select parentid
        from tree
       where id = (select parentid
                     from tree
                    where id = t.parentid
                   )
     )
    ,(select parentid
        from tree
       where id = (select parentid
                     from tree
                    where id = (select parentid
                                  from tree
                                 where id = t.parentid
                                )
                   )
      )
    ,(select parentid
        from tree
       where id = (select parentid
                     from tree
                    where id = (select parentid
                                  from tree
                                 where id = (select parentid
                                               from tree
                                              where id = t.parentid
                                             )
                                )
                   )
      )
    from tree T
    where id not in (select parentid 
                       from tree
                     )
      

  7.   

    搂主的要求实际上就是找叶子节点,以及其祖先问题是叶子节点的层次可能不同,搂主没有说明如何处理。这个问题应该结合数据库来实现,Sql Server可以用存储过程和函数。如果一定要抛开数据库特性,建议在客户端实现。
      

  8.   

    第二种情况的SQL为:
    select a.id as level1,b.id as level2,b.others
    from table a,table b
    where a.id=b.parentid
      

  9.   

    第一种情况的SQL为:
    select a.id as level1,b.id as level2,c.id as level3,c.others
    from table a,table b,table c
    where a.id=b.parentid and b.id=c.parentid
      

  10.   

    我觉得总的来说,此问题就是一个自表关联的处理。如果要增加层次可以参照两种SQL的规律增加,即第一层的ID等于第二层的ParentID,第二层的ID等于第三层的ParentID,依此类推。
      

  11.   

    I agree with Haiwer(海阔天空)
      

  12.   

    如果一定要用SQL,建议用游标来生成你的SQL语句,然后在脚本中执行,可以写成一个存储过程,能优化很多。
      

  13.   

    alter proc AppSP_GetAllAncestors
    @x integer
    as
    -- 调用测试: AppSP_GetAllAncestors 40
    declare @sql0 varchar(8000)
    set @sql0='(select parentid from tree where id = t.parentid)'
    declare @Temp varchar(8000)
    set @Temp=@sql0
    declare @i int
    set @i=@x
    declare @j int
    set @j=0
    DECLARE @SQL varchar(8000)
    SET @SQL=''while exists (select 1 from tree where id=(select parentid from tree where id= @i)  )
          select   
                 @Temp =@SQL0
                ,@sql0 ='(select parentid from tree where id = ' + @sql0  + ') '
                ,@SQL  = @SQL + ' as ''' + cast(@j+1 as varchar) + ''',' + @Temp
                ,@i=parentid,@j=@j+1
            from Tree 
           where id=@iset @sql='select id as ''0'',parentid ' + @sql + ' as ''' + cast(@j+1 as varchar) + ''' from tree T where id =' + cast(@x as varchar)
    exec(@sql)
      

  14.   

    --把问题搞复杂了,其实:
    alter proc AppSP_GetAllAncestors
    @x integer
    as
    -- 调用测试: AppSP_GetAllAncestors 478
    declare @j int
    set @j=0declare @sql varchar(8000)
    set @sql=''declare @i integer
     select @i=parentid
       from tree
      where id=@xwhile exists (select 1 from tree where id=@i)
          select @sql = @sql + ',(select ' + cast(parentid as varchar) + ') as ''' + cast(@j+2 as varchar) + ''''
                 ,@i=parentid ,@j=@j+1
            from Tree 
           where id=@i   
    set @sql='select id as ''0'',parentid as ''1''' + @sql + ' from tree T where id =' + cast(@x as varchar)
    exec(@sql)
      

  15.   

    alter proc AppSP_GetAllAncestors
    @x integer
    as
    -- 调用测试: AppSP_GetAllAncestors 20
    declare @j int
    set @j=0declare @sql varchar(8000)
    set @sql=''declare @i integer
     select @i=parentid
       from tree
      where id=@xwhile exists (select 1 from tree where id=@i)
          select @sql = @sql + ',' + cast(parentid as varchar) + ' as ''' + cast(@j+2 as varchar) + ''''
                 ,@i=parentid ,@j=@j+1
            from Tree 
           where id=@i   
    set @sql='select id as ''0'',parentid as ''1''' + @sql + ' from tree T where id =' + cast(@x as varchar)
    exec(@sql)前面的 SP都只能算一条记录!下面的sp 可以返回所有节点的"指定层数"的祖先:
    alter proc AppSP_GetAllAncestors
    @x integer
    as
    -- 调用测试: AppSP_GetAllAncestors 10
    declare @sql0 varchar(8000)
    set @sql0='(select parentid from tree where id = t.parentid)'
    declare @Temp varchar(8000)
    set @Temp=@sql0declare @i int
    set @i=0
    DECLARE @SQL varchar(8000)
    SET @SQL=''while @i < @x
          select   
                 @Temp =@SQL0
                ,@sql0 ='(select parentid from tree where id = ' + @sql0  + ') '
                ,@SQL  = @SQL + ' as ''' + cast(@i+1 as varchar) + ''',' + @Temp
                ,@i=@i+1
    set @sql='select id as ''0'',parentid ' + @sql + ' as ''' + cast(@i+1 as varchar) + ''' from tree T'
    exec(@sql)
      

  16.   

    playyuer:
        我刚才想到一个新的思路。在MS SQL Server2000里不是支持将一个数据集做为存储函数的返回值吗?如果以此建立一个递归的存储函数,将新检索出的数据与已有的数据做联接后生成新的返回值,不就可以递归生成完整的树状视图了吗?
        可惜我的机器上现在没有SQL Server,不然写出来试试。
      

  17.   

    这几天还在试,faint,比我想的难多了,涉及一些数学原理,看来没有很漂亮的解法。
      

  18.   

    ccat(智拙)兄,真的非常感谢您的关注!