请问两张表中字符串的连接问题
比如说有表dog,表cat
dog(id,name,fid,totalname):
-------------------
01 dog011 001 null
01 dog012 002 null
02 dog02 001 null
cat(id,name)
-------------------
001 cat001
002 cat002
dog.fid--->cat.id
我想得到 dog表中id为'01'的 totalname为对应cat表中的cat001和cat002相连接形式,
即 'cat001,cat002'
请问有没有什么好的算法?或者好的思路
谢谢!
问题点数:50、回复次数:6Top
1 楼pengdali()回复于 2003-12-02 11:51:58 得分 10
create function getstr(@content varchar(20))
returns varchar(2000)
as
begin
declare @str varchar(2000)
set @str=''
select @str=@str+','+rtrim(name) from a where id in (select fid from dog where id=@content)
set @str=right(@str,len(@str)-1)
return @str
end
go
--语句:
select id,dbo.getstr(id) 结果 from dog group by id
Top
2 楼txlicenhe(马可)回复于 2003-12-02 11:52:26 得分 10
http://expert.csdn.net/Expert/topic/2440/2440306.xml?temp=.6941645
[交流]行列转换Top
3 楼zjcxc(邹建)回复于 2003-12-02 12:08:24 得分 10
或临时表处理:
select *,aa=cast('' as varchar(8000)) into #t from dog order by id,fid
declare @id varchar(2),@a varchar(8000)
update #t set @a=case @id when id then @a+','+(select name from cat where id=a.fid) else (select name from cat where id=a.fid) end
,aa=@a,@id=id
select id,name,fname=max(aa0 from #t group by id,nameTop
4 楼zjcxc(邹建)回复于 2003-12-02 14:13:49 得分 10
--上面的错了,应该是:
--临时表的处理方法
select *,aa=cast('' as varchar(8000)) into #t from dog order by id,fid
declare @id varchar(2),@a varchar(8000)
update #t set @a=case @id when id then @a+','+(select name from cat where id=a.fid) else (select name from cat where id=a.fid) end
,aa=@a,@id=id
from #t a
--显示结果
select a.id,a.name,a.fid,totalname=b.aa
from dog a join (select id,aa=max(aa) from #t group by id) b on a.id=b.id
--如果是更新dog表
update dog set totalname=b.aa
from dog a join (select id,aa=max(aa) from #t group by id) b on a.id=b.id
Top
5 楼zjcxc(邹建)回复于 2003-12-02 14:14:05 得分 10
--下面是数据测试
--创建测试表
create table dog(id varchar(2),name varchar(10),fid varchar(3),totalname varchar(20))
insert into dog
select '01','dog011','001',null
union all select '01','dog012','002',null
union all select '02','dog02','001',null
create table cat(id varchar(3),name varchar(10))
insert into cat
select '001','cat001'
union all select '002','cat002'
go
--函数处理方法,创建自定义函数
create function f_merg(@id varchar(2))
returns varchar(8000)
as
begin
declare @re varchar(8000)
set @re=''
select @re=@re+','+a.name from cat a join dog b on a.id=b.fid where b.id=@id
set @re=substring(@re,2,8000)
return(@re)
end
go
--调用得到结果
select id,name,fid,totalname=dbo.f_merg(id)from dog
go
--临时表的处理方法
select *,aa=cast('' as varchar(8000)) into #t from dog order by id,fid
declare @id varchar(2),@a varchar(8000)
update #t set @a=case @id when id then @a+','+(select name from cat where id=a.fid) else (select name from cat where id=a.fid) end
,aa=@a,@id=id
from #t a
select a.id,a.name,a.fid,totalname=b.aa
from dog a join (select id,aa=max(aa) from #t group by id) b on a.id=b.id
go
--删除测试环境
drop table dog,cat,#t
drop function f_merg
/*--测试结果
--函数处理的结果
id name fid totalname
---- ---------- ---- --------------------
01 dog011 001 cat001,cat002
01 dog012 002 cat001,cat002
02 dog02 001 cat001
(所影响的行数为 3 行)
--临时表的处理结果:
id name fid totalname
---- ---------- ---- ---------------------
01 dog011 001 cat001,cat002
01 dog012 002 cat001,cat002
02 dog02 001 cat001
(所影响的行数为 3 行)
--*/Top
6 楼billy_seamans(小禾晴雨)(虎头蛇尾)回复于 2003-12-02 18:51:55 得分 0
真是谢谢各位大虾了!
我觉得数据库太有意思了Top




