您的位置:首页 > 数据库

SQL基础知识--多行查询结果拼接

2016-06-25 11:08 375 查看
今天在工作中遇到如下这个问题,需要将如下的查询结果,拼接成一行!

 1
select PERSON_NAME from S_PROJECT_MEMBER
where PROJECT_ID =
'2c9081473e2f8bda013e3028e4700049';
 

先直接上代码吧!-------------------------有问题的,麻烦指出--------------------------------------------------------

select
CAST(stuff((
select distinct ','+PERSON_NAME
from S_PROJECT_MEMBER
where PROJECT_ID = '2c9081473e2f8bda013e3028e4700049' for xml path('')),1,1,'') AS varchar(1000)
)
AS PERSON_NAMES
from S_PROJECT_MEMBER
where PROJECT_ID = '2c9081473e2f8bda013e3028e4700049' GROUP BY PROJECT_ID;


这里用的知识点有:

for xml path() 函数:

--这里用来做字符串拼接


CAST()函数:

--CAST函数用于将某种数据类型的表达式显式转换为另一种数据类型
cast( "abcdefg" as varchar(2000));


STUFF()函数:

--STUFF()
4000
函数用于删除指定长度的字符,并可以在制定的起点处插入另一组字符。

--select stuff(列名,开始位置,长度,替代字符串)


DISTINCT 关键字:

--这里可以理解为去重,具体可以百度


AS 关键字:

--取别名


GROP BY :

--用于分组


下面通过具体的例子来说明吧:    来自于:http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html

create table hobby(
hobbyId varchar(32),
hName varchar(32)
)

insert into hobby values('1','爬山');
insert into hobby values('2','游泳');
insert into hobby values('3','爬山');


--将查询结果根据行输出成XML格式
SELECT * FROM hobby FOR XML PATH;


--改变XML行节点的名称
SELECT * FROM hobby FOR XML PATH('MyHobby');


--改变XML列节点的名称
SELECT hobbyID as 'MyCode',hName as 'MyName' FROM hobby FOR XML PATH('MyHobby');


--构建我们喜欢的输出方式
SELECT '[ '+hName+' ]' FROM hobby FOR XML PATH('');


现在我对例子进行应用:

--应用
select distinct ','+hobbyId from hobby for xml path('');


-- for xml path('')  解决连接问题
select hName,(select distinct '+'+hobbyId from hobby h where h.hName = hName for xml path('')) AS A
from hobby
group by hName;


-- stuff(String,1,1,'') 去除开始的连接符  +1+2+3  --> 1+2+3
select hName,stuff((select distinct '+'+hobbyId from hobby  for xml path('')),1,1,'') AS A
from hobby
group by hName;


--需要查询结果

'爬山' '1'+'3'

'游泳' '2'

--方法一
select hName,stuff((select distinct '+'+hobbyId from hobby where hName = B.hName for xml path('')),1,1,'') AS A
from hobby B
group by hName;

--方法二
SELECT B.hName,LEFT(StuList,LEN(StuList)-1) as hobby FROM (
SELECT hName,
(SELECT hobbyId+',' FROM hobby
WHERE hName=A.hName
FOR XML PATH('')) AS StuList
FROM hobby A
GROUP BY hName
) B
结果:


第一次写笔记。。。。。2016.06.25
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: