首页 新闻 会员 周边 捐助

纠结的sql

0
[待解决问题]

     请高手指点!!那个我select  '证书' from UserInfo where UserID=1

结果一个人对应四五个证书的话就出来了四五行,我想一个人的所有证书在一列显示,而且用","隔开,怎么用啊,

拜托各位大侠求解啊。

    再次先谢过了!!

暖爱_晨的主页 暖爱_晨 | 初学一级 | 园豆:122
提问于:2011-07-31 00:24
< >
分享
所有回答(4)
0

一种是利用游标 自己拼接或者客户端做处理吧

慧☆星 | 园豆:5722 (大侠五级) | 2011-07-31 09:02
额可不可以给点具体操作啊,本人新手,不是很明白额!!
支持(0) 反对(0) 暖爱_晨 | 园豆:122 (初学一级) | 2011-07-31 11:17
0

第一种:可以到程序里处理;

第二种:首先要确保 一个用户的和一个证书最多是一条数据,而且证书种类要几乎不会变,如果是的话

select (select 证书列 from UserInfo where UserID=1 and 证书列='证书1' )
+','+(select 证书列 from UserInfo where UserID=1  and 证书列='证书2‘)
+','+(select 证书列 from UserInfo where UserID=1 and 证书列='证书3'  )
+','+(select 证书列 from UserInfo where UserID=1  and 证书列='证书4' )

依次类推

第三种:游标 但是不推荐 ,速度很慢

declare my_cursor cursor scroll dynamic
for
select 证书列 from  UserInfo where UserID=1 order by 证书列
open my_cursor
declare @pname sysname,@str varchar(500)
set @str=''
fetch next from my_cursor into  @pname
while(@@fetch_status=0)
 begin
  set @str=@str+','+@pname
  fetch next from my_cursor into @pname 
 end
close my_cursor
deallocate my_cursor
select @str

 

杯具程序员 | 园豆:1718 (小虾三级) | 2011-08-01 10:04
非常谢谢,麻烦你了,浪费了你的时间,哈哈!!
还是很谢谢了
支持(0) 反对(0) 暖爱_晨 | 园豆:122 (初学一级) | 2011-08-01 11:08
没有 相互学习
支持(0) 反对(0) 杯具程序员 | 园豆:1718 (小虾三级) | 2011-08-01 11:19
0

还有一种简单的办法。

declare @zhengshu varchar(max)

select @zhengshu=@zhengshu+','+证书 from UserInfo where UserID=1

刘鸿海 | 园豆:655 (小虾三级) | 2011-08-02 08:58
这确实是个人方法,但都不通用啊,我数据量相当的大的啊!!
支持(0) 反对(0) 暖爱_晨 | 园豆:122 (初学一级) | 2011-08-02 09:05
额不好意思打错了,是个方法!
支持(0) 反对(0) 暖爱_晨 | 园豆:122 (初学一级) | 2011-08-02 09:06
数据量很大,你是担心什么呢,@zhengshu变量放不下吗?
支持(0) 反对(0) 刘鸿海 | 园豆:655 (小虾三级) | 2011-08-02 09:32
可是你后面是where userid=什么什么
我总不可能一个一个写吧,我知道uid有多少啊,这太不通用了啊!
支持(0) 反对(0) 暖爱_晨 | 园豆:122 (初学一级) | 2011-08-03 08:49
你自己给的例子不就是where UserID=1吗?谁知道你是这种需求啊,
不过也简单啊,可以写动态语句啊。
支持(0) 反对(0) 刘鸿海 | 园豆:655 (小虾三级) | 2011-08-03 11:30
0

DECLARE @T1 table(UserID int , UserName nvarchar(50),CityName nvarchar(50));
insert into @T1 (UserID,UserName,CityName) values (1,'a','上海')
insert into @T1 (UserID,UserName,CityName) values (2,'b','北京')
insert into @T1 (UserID,UserName,CityName) values (3,'c','上海')
insert into @T1 (UserID,UserName,CityName) values (4,'d','北京')
insert into @T1 (UserID,UserName,CityName) values (5,'e','上海')
SELECT B.CityName,LEFT(UserList,LEN(UserList)-1) FROM (
SELECT CityName,
(
SELECT UserName+',' FROM @T1 WHERE CityName=A.CityName FOR XML PATH('')) AS UserList
FROM @T1 A
GROUP BY CityName
) B

Leon_He | 园豆:205 (菜鸟二级) | 2011-08-02 23:37
这也是一种好的办法。
支持(0) 反对(0) 刘鸿海 | 园豆:655 (小虾三级) | 2011-08-03 07:59
呀这有点不明白什么方法了,我新手劳烦可以解释下吗
支持(0) 反对(0) 暖爱_晨 | 园豆:122 (初学一级) | 2011-08-03 08:55
太牛了,麻烦解释了,就得用这个方法啊,谢谢了,太感谢了!!
支持(0) 反对(0) 暖爱_晨 | 园豆:122 (初学一级) | 2011-08-03 08:58
@暖爱_晨:关键是 FOR XML PATH 的使用。你了解了这个,就知道怎么解决了。百度一下这个的使用吧。
支持(0) 反对(0) Leon_He | 园豆:205 (菜鸟二级) | 2011-08-03 09:08
sql 2000中不支持这个,05,08 支持
这个就是将记录转换成xml形式,再把标记去掉
支持(0) 反对(0) like%'远远'% | 园豆:635 (小虾三级) | 2011-08-03 17:58
嗯我用的就是08,好了谢谢各位大虾哈哈
支持(0) 反对(0) 暖爱_晨 | 园豆:122 (初学一级) | 2011-08-04 10:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册