大类编码  小类编码 名称
0,1,苹果
0,2,梨子
1,1001,绿苹果
1,1002,小苹果
2,2001,雪梨
2,2002,鸭梨如果大类为0的可以不用考虑.如果存在子类.显示就不一样了
达到的效果
大类编码  小类编码 名称
0,1,苹果
0,2,梨子
1,1001,苹果--绿苹果
1,1002,苹果--小苹果
2,2001,梨子--雪梨
2,2002,梨子--鸭梨这样的效果一个查询能够搞定不?希望大家帮个忙.

解决方案 »

  1.   

    create table tb(大类编码 int, 小类编码 int,名称 varchar(10))
    insert into tb values(0,1,'苹果') 
    insert into tb values(0,2,'梨子')
    insert into tb values(1,1001,'绿苹果') 
    insert into tb values(1,1002,'小苹果') 
    insert into tb values(2,2001,'雪梨') 
    insert into tb values(2,2002,'鸭梨')
    goselect * from tb where 大类编码 = 0
    union all
    select 大类编码,小类编码,(select 名称 from tb where 大类编码 = 0 and 小类编码 = t.大类编码) + '--' + 名称 from tb t where 大类编码 <> 0drop table tb /*
    大类编码        小类编码        名称                     
    ----------- ----------- ---------------------- 
    0           1           苹果
    0           2           梨子
    1           1001        苹果--绿苹果
    1           1002        苹果--小苹果
    2           2001        梨子--雪梨
    2           2002        梨子--鸭梨(所影响的行数为 6 行)*/
      

  2.   

    --保险起见加个 top 1create table tb(大类编码 int, 小类编码 int,名称 varchar(10))
    insert into tb values(0,1,'苹果') 
    insert into tb values(0,2,'梨子')
    insert into tb values(1,1001,'绿苹果') 
    insert into tb values(1,1002,'小苹果') 
    insert into tb values(2,2001,'雪梨') 
    insert into tb values(2,2002,'鸭梨')
    goselect * from tb where 大类编码 = 0
    union all
    select 大类编码,小类编码,(select top 1 名称 from tb where 大类编码 = 0 and 小类编码 = t.大类编码) + '--' + 名称 from tb t where 大类编码 <> 0drop table tb /*
    大类编码        小类编码        名称                     
    ----------- ----------- ---------------------- 
    0           1           苹果
    0           2           梨子
    1           1001        苹果--绿苹果
    1           1002        苹果--小苹果
    2           2001        梨子--雪梨
    2           2002        梨子--鸭梨(所影响的行数为 6 行)*/
      

  3.   

    dawugui大哥
    也整个多级的出来吧~~
    谢谢
      

  4.   

    这是李钻石写的.create table test(id int,pid int,name varchar(10))
    insert into test 
    select 1,0,'学习总结' union 
    select 2,4,'鼠标事件' union
    select 3,4,'tree'     union 
    select 4,6,'swing'    union 
    select 6,1,'java'    union 
    select 7,1,'C++'     union 
    select 9,6,'eclipse' 
    gocreate function f_getNum(@id int)
    returns varchar(4000)
    as
    begin
        declare @ret varchar(4000),@pid int
        set @ret = right('0000'+rtrim(@id),4)
        while exists(select 1 from test where id=@id and pid!=0)
        begin
            select @pid=pid from test where id=@id and pid!=0
            set @id = @pid
            set @ret = right('0000'+rtrim(@id),4)+@ret
        end
        return @ret
    end
    goselect REPLICATE('-',len(dbo.f_getNum(id))/4-1)+name as name  from test order by dbo.f_getNum(id)
    /*
    name       
    ---------- 
    学习总结
    -java
    --swing
    ---鼠标事件
    ---tree
    --eclipse
    -C++
    */
    godrop function f_getNum
    drop table test
    go
      

  5.   

    DECLARE @a table(大类编码 int, 小类编码 int,名称 varchar(10))
    insert @a SELECT 0,1,'苹果' 
    union all SELECT 0,2,'梨子'
    union all SELECT 1,1001,'绿苹果' 
    union all SELECT 1,1002,'小苹果' 
    union all SELECT 2,2001,'雪梨'
    union all SELECT 2,2002,'鸭梨'SELECT a.大类编码,a.小类编码,coalesce(b.名称+'-'+a.名称,a.名称) 名称 FROM @a a left join @a b ON a.大类编码=b.小类编码--result
    /*大类编码        小类编码        名称                    
    ----------- ----------- --------------------- 
    0           1           苹果
    0           2           梨子
    1           1001        苹果-绿苹果
    1           1002        苹果-小苹果
    2           2001        梨子-雪梨
    2           2002        梨子-鸭梨(所影响的行数为 6 行)*/