请哪位大侠帮忙用sql语句从图1转换成图2,谢谢!好急!!!!!图1
id  parent  level  mb01    mb02  mb03   mb04  mb05 
----------------------------------------------------- 
1   -1      1      T0001   1     T0002  PCS   原材料
2   -1      1      T0001   2     T0003  PCS   原材料
3   -1      1      T0001   3     T0010  PCS   半成品
4   -1      1      T0001   4     T0004  PCS   原材料
5    3      2      T0010   1     T0007  PCS   原材料
6    3      2      T0010   2     T0008  PCS   原材料
7    3      2      T0010   3     T0009  PCS   原材料
8    3      2      T0010   4     T0005  PCS   半成品
9    3      2      T0010   5     T0006  PCS   原材料
10   8      3      T0005   1     T0002  PCS   原材料
11   8      3      T0005   2     T0004  PCS   原材料
图2
id  parent  level  mb01    mb02  mb03   mb04  mb05 
---------------------------------------------------- 
1   -1      1      T0001   1     T0002  PCS   原材料
2   -1      1      T0001   2     T0003  PCS   原材料
3   -1      1      T0001   3     T0010  PCS   半成品
5    3      2      T0010   1     T0007  PCS   原材料
6    3      2      T0010   2     T0008  PCS   原材料
7    3      2      T0010   3     T0009  PCS   原材料
8    3      2      T0010   4     T0005  PCS   半成品
10   8      3      T0005   1     T0002  PCS   原材料
11   8      3      T0005   2     T0004  PCS   原材料
9    3      2      T0010   5     T0006  PCS   原材料
4   -1      1      T0001   4     T0004  PCS   原材料

解决方案 »

  1.   

    create table t(id int,parent int,level int,mb01 varchar(8),mb02 int,mb03 varchar(8),mb04 varchar(8),mb05 varchar(8))
    insert into t select 1 ,-1,1,'T0001',1,'T0002','PCS','原材料'
    insert into t select 2 ,-1,1,'T0001',2,'T0003','PCS','原材料'
    insert into t select 3 ,-1,1,'T0001',3,'T0010','PCS','半成品'
    insert into t select 4 ,-1,1,'T0001',4,'T0004','PCS','原材料'
    insert into t select 5 , 3,2,'T0010',1,'T0007','PCS','原材料'
    insert into t select 6 , 3,2,'T0010',2,'T0008','PCS','原材料'
    insert into t select 7 , 3,2,'T0010',3,'T0009','PCS','原材料'
    insert into t select 8 , 3,2,'T0010',4,'T0005','PCS','半成品'
    insert into t select 9 , 3,2,'T0010',5,'T0006','PCS','原材料'
    insert into t select 10, 8,3,'T0005',1,'T0002','PCS','原材料'
    insert into t select 11, 8,3,'T0005',2,'T0004','PCS','原材料'
    go
    --创建用户定义函数
    create 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 t where id=@id and parent!=-1)
        begin
            select @pid=parent from t where id=@id and parent!=-1
            set @id = @pid
            set @ret = right('0000'+rtrim(@id),4)+@ret
        end
        return @ret
    end
    goselect * from t order by dbo.f_getNum(id)
    go
    /*
    id  parent  level  mb01    mb02  mb03   mb04  mb05 
    ---------------------------------------------------- 
    1   -1      1      T0001   1     T0002  PCS   原材料
    2   -1      1      T0001   2     T0003  PCS   原材料
    3   -1      1      T0001   3     T0010  PCS   半成品
    5    3      2      T0010   1     T0007  PCS   原材料
    6    3      2      T0010   2     T0008  PCS   原材料
    7    3      2      T0010   3     T0009  PCS   原材料
    8    3      2      T0010   4     T0005  PCS   半成品
    10   8      3      T0005   1     T0002  PCS   原材料
    11   8      3      T0005   2     T0004  PCS   原材料
    9    3      2      T0010   5     T0006  PCS   原材料
    4   -1      1      T0001   4     T0004  PCS   原材料
    */
    drop function f_getNum
    drop table t
    go
      

  2.   

    请问: libin_ftsafe(子陌红尘:Dev-Club的潇湘) 
    我的图1和图2都是表,且创建的函数不要带参数,能帮忙再建一个吗
      

  3.   

    我的图1和图2都是表,且创建的函数不要带参数,能帮忙再建一个吗
    -------------------------------------------------------------------------------------------
    我已经把图1当作表T来处理了,图2是张表?那就把查询的结果insert到图2对应的表里去。要求函数不带参数?我那个函数里的参数对排序至关重要,不能去掉。
      

  4.   

    请问:
      libin_ftsafe(子陌红尘:当libin告别ftsafe)
      
      你好!
      
    --创建用户定义函数
    create 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 t where id=@id and parent!=-1)
        begin
            select @pid=parent from t where id=@id and parent!=-1
            set @id = @pid
            set @ret = right('0000'+rtrim(@id),4)+@ret
        end
        return @ret
    end
    以上表t如果是我自定义函数产生的临时表@t,那你的这段代码加在我的自定义函数中,谢谢解答
      

  5.   

    libin_ftsafe(子陌红尘:当libin告别ftsafe)
    你好,帮忙解答一下好吗!急!!!!
      

  6.   

    --创建用户定义函数
    create function f_getNum()
    returns @t table (id int,parent int,level int,mb01 varchar(8),mb02 int,mb03 varchar(8),mb04 varchar(8),mb05 varchar(8))
    as
    begin    
        insert into @t select 1 ,-1,1,'T0001',1,'T0002','PCS','原材料'
        insert into @t select 2 ,-1,1,'T0001',2,'T0003','PCS','原材料'
        insert into @t select 3 ,-1,1,'T0001',3,'T0010','PCS','半成品'
        insert into @t select 4 ,-1,1,'T0001',4,'T0004','PCS','原材料'
        insert into @t select 5 , 3,2,'T0010',1,'T0007','PCS','原材料'
        insert into @t select 6 , 3,2,'T0010',2,'T0008','PCS','原材料'
        insert into @t select 7 , 3,2,'T0010',3,'T0009','PCS','原材料'
        insert into @t select 8 , 3,2,'T0010',4,'T0005','PCS','半成品'
        insert into @t select 9 , 3,2,'T0010',5,'T0006','PCS','原材料'
        insert into @t select 10, 8,3,'T0005',1,'T0002','PCS','原材料'
        insert into @t select 11, 8,3,'T0005',2,'T0004','PCS','原材料'
        
        
        declare @t1 table(id int,parent int,level int,mb01 varchar(8),mb02 int,
                       mb03 varchar(8),mb04 varchar(8),mb05 varchar(8),
                       ord varchar(40))
        
        insert into @t1 
        select *,case parent when -1 then '' else right('0000'+rtrim(parent),4) end+right('0000'+rtrim(id),4) 
        from @t
        
        if @@rowcount<>0
        begin
            update b
            set
                ord=right('0000'+rtrim(a.parent),4)+b.ord
            from 
                @t  a,
                @t1 b
            where
                a.id=left(ord,4)
                and
                a.parent!=-1
        end
        
        delete @t
        
        insert into @t
        select id ,parent ,level ,mb01,mb02 ,mb03 ,mb04 ,mb05 from @t1 order by ord    return
    end
    goselect * from dbo.f_getNum()
    go
    /*
    id  parent  level  mb01    mb02  mb03   mb04  mb05 
    ---------------------------------------------------- 
    1   -1      1      T0001   1     T0002  PCS   原材料
    2   -1      1      T0001   2     T0003  PCS   原材料
    3   -1      1      T0001   3     T0010  PCS   半成品
    5    3      2      T0010   1     T0007  PCS   原材料
    6    3      2      T0010   2     T0008  PCS   原材料
    7    3      2      T0010   3     T0009  PCS   原材料
    8    3      2      T0010   4     T0005  PCS   半成品
    10   8      3      T0005   1     T0002  PCS   原材料
    11   8      3      T0005   2     T0004  PCS   原材料
    9    3      2      T0010   5     T0006  PCS   原材料
    4   -1      1      T0001   4     T0004  PCS   原材料
    */
    drop function f_getNum
    go
      

  7.   

    -- SQL 2005直接用CTE表达式就行了.create table t(id int,parent int,level int,mb01 varchar(8),mb02 int,mb03 varchar(8),mb04 varchar(8),mb05 varchar(8))
    insert into t select 1 ,-1,1,'T0001',1,'T0002','PCS','原材料'
    insert into t select 2 ,-1,1,'T0001',2,'T0003','PCS','原材料'
    insert into t select 3 ,-1,1,'T0001',3,'T0010','PCS','半成品'
    insert into t select 4 ,-1,1,'T0001',4,'T0004','PCS','原材料'
    insert into t select 5 , 3,2,'T0010',1,'T0007','PCS','原材料'
    insert into t select 6 , 3,2,'T0010',2,'T0008','PCS','原材料'
    insert into t select 7 , 3,2,'T0010',3,'T0009','PCS','原材料'
    insert into t select 8 , 3,2,'T0010',4,'T0005','PCS','半成品'
    insert into t select 9 , 3,2,'T0010',5,'T0006','PCS','原材料'
    insert into t select 10, 8,3,'T0005',1,'T0002','PCS','原材料'
    insert into t select 11, 8,3,'T0005',2,'T0004','PCS','原材料'
    go;WITH
    TREE AS(
    SELECT *, Path = CONVERT(nvarchar(max), RIGHT(10000 + id, 4))
    FROM t
    WHERE parent = -1
    UNION ALL
    SELECT A.*, Path = B.Path + CONVERT(nvarchar(max), RIGHT(10000 + A.id, 4))
    FROM t A, TREE B
    WHERE A.parent = B.id
    )
    SELECT *
    FROM TREE
    ORDER BY Path, id
    go
    drop table t