CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

请问两张表中字符串的连接问题

楼主billy_seamans(小禾晴雨)(虎头蛇尾)2003-12-02 11:48:33 在 MS-SQL Server / 基础类 提问

比如说有表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

相关问题

  • 连接字符串
  • 连接字符串
  • 字符串连接
  • 连接字符串
  • 字符串连接
  • VB如何在ADO中用连接字符串打开FOXPRO表?
  • 字符串连接问题
  • 字符串的连接
  • ?ODBC连接字符串
  • 字符串连接问题

关键词

  • dog
  • 表
  • fid
  • cat
  • varchar
  • aa
  • str
  • where
  • set
  • select

得分解答快速导航

  • 帖主:billy_seamans
  • pengdali
  • txlicenhe
  • zjcxc
  • zjcxc
  • zjcxc

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo