SQL基础知识--多行查询结果拼接
2016-06-25 11:08
375 查看
今天在工作中遇到如下这个问题,需要将如下的查询结果,拼接成一行!
1
select PERSON_NAME from S_PROJECT_MEMBER
where PROJECT_ID =
'2c9081473e2f8bda013e3028e4700049';
先直接上代码吧!-------------------------有问题的,麻烦指出--------------------------------------------------------
这里用的知识点有:
for xml path() 函数:
CAST()函数:
STUFF()函数:
DISTINCT 关键字:
AS 关键字:
GROP BY :
下面通过具体的例子来说明吧: 来自于:http://www.cnblogs.com/doubleliang/archive/2011/07/06/2098775.html
现在我对例子进行应用:
--需要查询结果
'爬山' '1'+'3'
'游泳' '2'
第一次写笔记。。。。。2016.06.25
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
相关文章推荐
- MySQL安装(以程序的方式启动)zip版
- SQL Server存储机制
- 用Redis的set指令实现锁
- Oracle 数据库开启关闭 及 端口监听相关命令
- Mysql 数据库的数据大小查看:
- Linux下启动相关oracle服务与监听的命令
- sql表,库的创建和删除
- ORACLE数据库忘记SYS和SYSTEM密码,SYSTEM被锁定怎么办?
- SQL 操作结果集 -并集、差集、交集、结果集排序
- 数据库管理系统的登录名、角色,数据库的用户、角色和架构
- MySQL join查询分类
- SQL错误:将截断字符串或者二进制数据
- 公司mysql数据库设计与优化培训ppt
- MySQL 5.6 for Windows 解压缩版配置安装
- mysql介绍
- hql和sql的用法区别
- plsql连接远程数据库
- SQL2008中Merge的用法
- mysql实现合并同一ID对应多条数据的方法
- rails 配置使用mysql