请哪位大侠帮忙用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 原材料
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 原材料
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
我的图1和图2都是表,且创建的函数不要带参数,能帮忙再建一个吗
-------------------------------------------------------------------------------------------
我已经把图1当作表T来处理了,图2是张表?那就把查询的结果insert到图2对应的表里去。要求函数不带参数?我那个函数里的参数对排序至关重要,不能去掉。
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,那你的这段代码加在我的自定义函数中,谢谢解答
你好,帮忙解答一下好吗!急!!!!
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
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