文档章节

SQL中将某个表中的多行数据在一个字段显示

o
 osc_z1hvg4cu
发布于 2018/04/24 23:01
字数 728
阅读 5
收藏 0
go

精选30+云产品,助力企业轻松上云!>>>

项目需求:将某个表中的多行数据在一个字段显示,如下:

比如表A中有字段 ID,NAME,

表B中有字段ID,PID,DES,

表A,表B中的数据分别如下:

ID NAME
1 张三
2 李四

ID PID DES
1 1 语文
2 1 数学
3 1 外语
4 2 历史
5 2 地理

最终我想显示的效果为:

ID NAME KC
1 张三 语文,数学,外语
2 李四 历史,地理

方法:使用sql中的STUFF函数与for xml path

 1.for xml path是将将查询结果集以XML形式展现

比如对于表B,select * from b for xml path('')

得到的结果集如下:

<ID>1</ID>
<PID>1</PID>
<DES>语文</DES>
<ID>2</ID>
<PID>1</PID>
<DES>数学</DES>
<ID>3</ID>
<PID>1</PID>
<DES>外语</DES>
<ID>4</ID>
<PID>2</PID>
<DES>历史</DES>
<ID>5</ID>
<PID>2</PID>
<DES>地理</DES>
View Code

这里数据集不是作为多行数据展示

2.stuff函数的用法为:stuff(param1, startIndex, length, param2)
说明:将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。

因此,将多行数据转换为一行的格式写法为:

select ID as ID,Name as NAME,
(select stuff((select ','+DES from b where b.PID=a.ID for xml path('')),1,1,'')) as KC
from a

 

补充STUFF 的详细说明

STUFF ( character_expression , start , length ,character_expression ) 
参数 
character_expression 
一个字符数据表达式。character_expression 可以是常量、变量,也可以是字符列或二进制数据列。

start 
一个整数值,指定删除和插入的开始位置。如果 start 或 length 为负,则返回空字符串。如果 start 比第一个character_expression 长,则返回空字符串。start 可以是 bigint 类型。

length 
一个整数,指定要删除的字符数。如果 length 比第一个 character_expression 长,则最多删除到最后一个character_expression 中的最后一个字符。length 可以是 bigint 类型。

返回类型 
如果 character_expression 是受支持的字符数据类型,则返回字符数据。如果 character_expression 是一个受支持的 binary 数据类型,则返回二进制数据。


备注 
如果开始位置或长度值是负数,或者如果开始位置大于第一个字符串的长度,将返回空字符串。如果要删除的长度大于第一个字符串的长度,将删除到第一个字符串中的第一个字符。 
如果结果值大于返回类型支持的最大值,则产生错误。


示例 
以下示例在第一个字符串 abcdef 中删除从第 2 个位置(字符 b)开始的三个字符,然后在删除的起始位置插入第二个字符串,从而创建并返回一个字符串。

SELECT STUFF('abcdef', 2, 3, 'ijklmn'); 
GO

下面是结果集: 
--------- 
aijklmnef

 

 

原文出处:https://www.cnblogs.com/IceNewMan/p/5707470.html
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。

暂无文章

Mysql高可用架构

低读低写并发、低数据量方案 方案一:双机高可用方案 1.数据库架构图 2.特点 一台机器A作为读写库,另一台B作为备份库;A库故障后B库作为读写库;A库恢复后A作为备库。 3.开发说明 此种情况下...

osc_2axit9df
27分钟前
16
0
ASP.NET Core Web Api之JWT刷新Token(三)

前言 如题,本节我们进入JWT最后一节内容,JWT本质上就是从身份认证服务器获取访问令牌,继而对于用户后续可访问受保护资源,但是关键问题是:访问令牌的生命周期到底设置成多久呢?见过一些...

osc_p1q9onsn
28分钟前
8
0
[PA2015]Siano 单调栈

由于某人找了个单调栈的题解但是没研究透所以让我们来研究。。。。。。。。。。。。 首先先来考虑下面一种情况,假设第\(k\)次切割时,天数为\(d_k\),高度为\(b_k\),第\(k+1\)次切割时,天...

osc_b71hj3or
29分钟前
6
0
reg007最新邀请码!!!

需要的小伙伴留邮箱我邀请你们。

osc_9na1lmr9
31分钟前
4
0
居家日常(第二周)

开个新坑,开个新坑。主要感觉都写在一篇博客里有亿点长。接下来的文笔会更精彩(大雾) 6.29 周一   开新坑啦!!!这周日记打算好好地写点东西出来。当我真正想坐下来写点东西的时候就很...

osc_kf7nv2km
33分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部