应求建立一个SQLServer数据表存储二叉树,表结构应该有2种
1、节点编号,父节点编号,是左孩子还是右孩子,节点的数值域,节点的创建日期
2、节点编号,父节点编号,左孩子编号,右孩子编号,节点的数值域,节点的创建日期需要的功能是,任意给定一个节点编号,遍历他的左(或者右)子树,求得所有左(或者右)子树节点的数值域的和,并且以层序遍历输出左(或者右)子树的一张数据表。
请教一个最优化的查询,效率一定要高,因为这是个asp.net的程序,同时可能有上千人并发访问。上面那2个表的结构用哪个效率更高一些?或者可能还有其他的设计方法?

解决方案 »

  1.   

    ref:http://topic.csdn.net/t/20041228/15/3682736.html--树形数据查询示例  
      --作者:   邹建  
       
      --示例数据  
      create   table   [tb]([id]   int   identity(1,1),[pid]   int,name   varchar(20))  
      insert   [tb]   select   0,'中国'  
      union     all     select   0,'美国'  
      union     all     select   0,'加拿大'  
      union     all     select   1,'北京'  
      union     all     select   1,'上海'  
      union     all     select   1,'江苏'  
      union     all     select   6,'苏州'  
      union     all     select   7,'常熟'  
      union     all     select   6,'南京'  
      union     all     select   6,'无锡'  
      union     all     select   2,'纽约'  
      union     all     select   2,'旧金山'  
      go  
       
      --查询指定id的所有子  
      create   function   f_cid(  
      @id   int  
      )returns   @re   table([id]   int,[level]   int)  
      as  
      begin  
      declare   @l   int  
      set   @l=0  
      insert   @re   select   @id,@l  
      while   @@rowcount>0  
      begin  
      set   @l=@l+1  
      insert   @re   select   a.[id],@l  
      from   [tb]   a,@re   b  
      where   a.[pid]=b.[id]   and   b.[level]=@l-1  
      end  
      /*--如果只显示最明细的子(下面没有子),则加上这个删除  
      delete   a   from   @re   a  
      where   exists(  
      select   1   from   [tb]   where   [pid]=a.[id])  
      --*/  
      return  
      end  
      go  
       
      --调用(查询所有的子)  
      select   a.*,层次=b.[level]   from   [tb]   a,f_cid(2)b   where   a.[id]=b.[id]  
      go