我的数据分类表如下
ID      ParentID       Name  
1       NULL           计算机类
101     1              操作系统
102     1              开发语言
10201   102            C语言
10202   102            JAVA
103     1              算法
2       NULL           语文
201     2              中学语文
我又这样一个分类表,通过数据迁移过来的数据。
101,102,103为1的子类,10201,10202为102的子类。现在我想获得没个类别下面有多少书,怎么递归写法。
1下面有多少书,要包含所有子类别的书。
麻烦那位高手来看看。

解决方案 »

  1.   

    我的数据分类表如下 
    ID             ParentID               Name     
    1               NULL                  计算机类 
    101             1                     操作系统 
    102             1                     开发语言 
    10201           102                   C语言 
    10202           102                   JAVA 
    103             1                     算法 
    2               NULL                  语文 
    201             2                     中学语文 
    我有这样一个分类表,通过数据迁移过来的数据。 
    101,102,103为1的子类,10201,10202为102的子类。 现在我想获得每个类别下面有多少书,怎么递归写法。 
    1下面有多少书,要包含所有子类别的书。 
    麻烦那位高手来看看。
      

  2.   

    哥们,你也看看别人的吧
    然后自己解决,我上午就自己写的,然后还要揭贴。合乎-- 树形数据层次显示处理示例
    --测试数据
    DECLARE @t TABLE(ID char(3),PID char(3),Name nvarchar(10))
    INSERT @t SELECT '001',NULL ,'山东省'
    UNION ALL SELECT '002','001','烟台市'
    UNION ALL SELECT '004','002','招远市'
    UNION ALL SELECT '003','001','青岛市'
    UNION ALL SELECT '005',NULL ,'四会市'
    UNION ALL SELECT '006','005','清远市'
    UNION ALL SELECT '007','006','小分市'--深度排序显示处理
    --生成每个节点的编码累计(相同当单编号法的编码)
    DECLARE @t_Level TABLE(ID char(3),Level int,Sort varchar(8000))
    DECLARE @Level int
    SET @Level=0
    INSERT @t_Level SELECT ID,@Level,ID
    FROM @t
    WHERE PID IS NULL
    WHILE @@ROWCOUNT>0
    BEGIN
        SET @Level=@Level+1
        INSERT @t_Level SELECT a.ID,@Level,b.Sort+a.ID
        FROM @t a,@t_Level b
        WHERE a.PID=b.ID
            AND b.Level=@Level-1
    END--显示结果
    SELECT SPACE(b.Level*2)+'|--'+a.Name
    FROM @t a,@t_Level b
    WHERE a.ID=b.ID
    ORDER BY b.Sort
    /*--结果
    |--山东省
      |--烟台市
        |--招远市
      |--青岛市
    |--四会市
      |--清远市
        |--小分市
    --*/
      

  3.   

    楼上的有点不合适,还有一个图书表
    BookID    ClassID    BookName
    1            1         DHHJ
    2          10101       dfadsf
    关键我想通过这两张表返回一个临时表,里面的结果如下显示
    ID    ParentID     NAME           NUM
    1      NULL       计算机类           10
    101      1        操作系统           12
    102      1        开发语言            8包括4个字段  ID,父ID,名称,这个类别的图书数量(包含所有子类别的)。
      

  4.   


    这里有个根据表的记录数创建临时表的存储过程,和你的很相似,图书表有多少条记录,就根据记录创建相应的临时表,你改改就可以了
    /*
    id          fname                                fcode
    ----------- ------------------------------------------------
    134         电脑_金和田主机_金和田主机(蓝色)    01.004.01
    136         电脑_金和田主机_金和田主机(黑色)    01.004.02
    140         电脑_金和田电脑                      01.088
    129         电脑_三星显示器                      01.001
    131         电脑_Ace鼠标                         01.002
    220         自制件_机箱板                        02.004
    142         自制件_机箱                          02.001
    158         原材料_钢板                          03.007
    159         原材料_机箱板                        03.008
    fcode       flevel      fname
    ----------- ----------- ----------
    1           1           电脑
    2           1           自制件
    3           1           原材料
    5           1           手机
    id          fsale
    ----------- ---------------------------------------
    134         123.00
    136         311.00
    220         543.00
    生成下面的结果
    id          fname                            fcode                fsale
    ----------- ---------------------------------------------------------------------
    134         电脑_金和田主机_金和田主机(蓝色)      01.004.01            123.00
    136         电脑_金和田主机_金和田主机(黑色)      01.004.02            311.00
    140         电脑_金和田电脑                       01.088               0.00
    129         电脑_三星显示器                       01.001               0.00
    131         电脑_Ace鼠标                          01.002               0.00
    id          fname                          fcode                fsale
    ----------- ---------------------------------------------------------------
    220         自制件_机箱板                  02.004               543.00
    142         自制件_机箱                    02.001               0.00*/
    create table fa(id int, fname varchar(100), fcode varchar(20))
    insert fa
    select 134, '电脑_金和田主机_金和田主机(蓝色)', '01.004.01' 
    union all select 136, '电脑_金和田主机_金和田主机(黑色)', '01.004.02' 
    union all select 140, '电脑_金和田电脑', '01.088' 
    union all select 129, '电脑_三星显示器', '01.001' 
    union all select 131, '电脑_Ace鼠标', '01.002' 
    union all select 220, '自制件_机箱板', '02.004' 
    union all select 142, '自制件_机箱', '02.001' 
    union all select 158, '原材料_钢板', '03.007' 
    union all select 159, '原材料_机箱板','03.008' create table fb(fcode int, flevel int, fname varchar(10))
    insert fb
    select 01,1,'电脑' 
    union all select 02,1,'自制件' 
    union all select 03,1,'原材料' 
    union all select 05,1,'手机' create table fc(id int, fsale decimal(5,2))
    insert fc
    select 134,123.00 
    union all select 136,311.00 
    union all select 220,543.00 declare @i int
    set @i=(select count(*) from fb)
    declare @k int
    set @k=1
    declare @sql varchar(500) 
    while @i>=@k
      begin
         set @sql = 'Select Top 1 * into #fb' + convert(varchar(5),@k)+ ' From fb Where fcode in (Select Top '+ convert(varchar(5),@k)+' fcode From fb) Order by fcode desc' 
         set @sql = @sql + ' if exists(select id from fa,#fb' + convert(varchar(5),@k)+ 
                '  where fa.fname like '+char(39)+ '%'+ char(39)+ '+#fb' + convert(varchar(5),@k)+ '.fname+'+char(39)+ '%'+ char(39)+ ')  begin select fa.id, fa.fname, fa.fcode, isnull(fc.fsale,0) as fsale into #TempTable'
                  + convert(varchar(5),@k)+ '  from fa left join fc on fa.id=fc.id, #fb' + convert(varchar(5),@k)+ ' where fa.fname like '+char(39)+ '%'+ char(39)+ '+#fb'+ convert(varchar(5),@k)+'.fname+'+char(39)+ '%'+ char(39)+ '  select * from #TempTable' + convert(varchar(5),@k)+ ' end'
         set @k=@k+1
         exec(@sql)
     end
      

  5.   


    上面的是根据fb表的fname的内容创建相应的临时表,应该创建4个表,但是fa中没有对应‘手机’的所以只创建了3给表
    id          fname                            fcode                fsale
    ----------- ---------------------------------------------------------------------
    134         电脑_金和田主机_金和田主机(蓝色)      01.004.01            123.00
    136         电脑_金和田主机_金和田主机(黑色)      01.004.02            311.00
    140         电脑_金和田电脑                       01.088               0.00
    129         电脑_三星显示器                       01.001               0.00
    131         电脑_Ace鼠标                          01.002               0.00
    id          fname                          fcode                fsale
    ----------- ---------------------------------------------------------------
    220         自制件_机箱板                  02.004               543.00
    142         自制件_机箱                    02.001               0.00
    id          fname                         fcode                fsale
    ----------- --------------------------------------------- -----------------
    158         原材料_钢板                   03.007               0.00
    159         原材料_机箱板                 03.008               0.00
      

  6.   

    我就不写了,请楼主看我的blog 有详细实例http://blog.csdn.net/fa_ge/archive/2007/11/21/1895742.aspx