使用 SQL的 for xml path来进行字符串拼接

本篇主要讲怎么利用SQL的FOR XML PATH 参数来进行字符串拼接,FOR XML PATH的用法很简单,它会以xml文件的形式来返回数据。

  我的讲解步骤:

1:构造初始数据

2:提出问题

3:简单介绍FOR XML PATH

4:解答问题

1.构造初始数据

举出一个经典的学生课程例子,共有学生、课程与学生课程三张表。

  表1:Student

student_id student_name
1 张三
2 李四
3 王五

表2:Course

course_id course_name
1 语言
2 数学
3 英语

表3:Student_Course

student_id course_id
1 2
1 3
2 1
2 3
3 3

脚本:

create table  student (     student_id int primary key,     student_name nvarchar(50) not null )
create table  course (     course_id int primary key,     course_name nvarchar(50) not null )
create table  student_course (     student_id int not null,     course_id int not null,     primary key(student_id,course_id) )

2.提出问题

写一条SQL语句,查询显示出下列结果:

student_name course_name
张三 数学,英语
李四 语言,英语
王五 英语

3.简单介绍 FOR XML PATH

FOR XML PATH 语句能够把查询的数据生成XML数据,举个例子,针对student表,以前SQL语句的查询结果为:

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->select str(student_id) + ‘,‘ + student_name from student for xml path(‘student‘)

查询结果:

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--><student>         1,张三</student> <student>         2,李四</student> <student>         3,王五</student>

student已成为一个xml文件中的结点了,再看看FOR XML PATH(‘‘)的效果,针对上述SQL作出修改,

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->select str(student_id) + ‘,‘ + student_name from student for xml path(‘‘)

查询结果:

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->1,张三 2,李四 3,王五

看得出来,这个参数自动把我们的查询结果串接在一起了,这下子,要做字符串拼接就很简单了!

4. 解答问题

要查询想要的结果,我们首先用一般的SQL语句,连接三个表之后的结果为:

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->select a.student_name,b.course_name from student_course c,student a,course b where              c.student_id=a.student_id and c.course_id=b.course_id

查询结果:

student_name course_name
张三 数学
张三 英语
李四 语文
李四 英语
王五 英语

我们把这个查询结果看作为一个临时表,与自身进行一次连接,再得用FOR XML PATH(‘‘)参数来对课程course_name列进行拼接,再得用子查询功能。这样就得到一个每一个学生的所选的所有课程,由于上表会存在同一学生的多条记录,所以需要对最后的结果按学生进行分组,先看看查询语句:

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

-->select student_name,    (select course_name+‘,‘ from       (         select student_name,course_name from           (             select a.student_name,b.course_name from stud_course c,student a,course b where c.student_id=a.student_id and c.course_id=b.course_id          ) as a      ) as b where c.student_name=b.student_name for xml path(‘‘)    ) as course_name     from      (         select a.student_name,b.course_name from student_course c,student a,course b where c.student_id=a.student_id and c.course_id=b.course_id     ) as c  group by student_name

查询结果:

student_name course_name
张三 数学,英语,
李四 语言,英语,
王五 英语,

还有个小问题, course_name后面多出一个,号,最后做一次裁剪,假设上面的SQL语句作为一个子查询 subquery

select student_name,left(course_name,len(course_name)-1) from (........) as subquery

这样,就可以得出最终的结果!可以看得出来FOR XML PATH(‘‘) 参数非常强大!

时间: 2024-08-10 16:22:04

使用 SQL的 for xml path来进行字符串拼接的相关文章

使用 SQL的 for xml path来进行字符串拼接 (group by)

参考: http://www.cnblogs.com/repository/archive/2011/01/18/1938418.html select convert(varchar(10),c.[STARTSPECDAY],120), (select [LeaveName]+' ' from ( select convert(varchar(10),a.[STARTSPECDAY],120) STARTSPECDAY,a.[LeaveName] from [test].[dbo].[View

SQL SERVER FOR XML PATH

转自:王波洋 (PS:对当前的博客进行了阅读,感觉不错,本来计划自己写一下,后来实在是时间不充裕并且博主写的不错,故转过来并稍微修正下) FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作. 一.FOR XML PATH 简单介绍           那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下:

灵活运用 SQL SERVER FOR XML PATH 转

灵活运用 SQL SERVER FOR XML PATH FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主. 一.FOR XML PATH 简单介绍              那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下: 接下来我们来看应用FOR XML PATH的查询结果

使用SQL SERVER FOR XML PATH将多个结果集转换成一行并进行去重处理

在一个医药行业的系统中需要根据患者的接触记录ID获取不同接触类型的集合,效果像这样 --患者接触记录信息,一个患者可以有N个不同的接触记录,每个接触记录又有N个接触类型记录 IF OBJECT_ID ('dbo.TEST') IS NOT NULL DROP TABLE dbo.TEST GO CREATE TABLE dbo.TEST ( ID INT IDENTITY (1000,1) NOT NULL, cid INT,--接触记录号 REMARK VARCHAR (4000), CONT

SQL Server FOR XML PATH 语句的应用---列转行

经常在论坛看到高手使用了 for xml path,由于是搜索一下,记录了详细的使用方法.在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据,下面是它的一些应用示例. DECLARE @TempTable table(UserID int , UserName nvarchar(50));insert into @TempTable (UserID,UserName) values (1,'a')insert into @TempTable (UserID

问题:sqlserver有没有类似Oracle的LISTAGG;结果: 灵活运用 SQL SERVER FOR XML PATH

灵活运用 SQL SERVER FOR XML PATH FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主. 一.FOR XML PATH 简单介绍              那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下: 接下来我们来看应用FOR XML PATH的查询结果

sql 使用 FOR XML PATH实现字符串拼接

sql中经常需要把多个行数据合成一行下面是利用 FOR XML PATH来实现的简单介绍. 1,把图一的转换为图二: 1 SELECT articleID, 2 (SELECT CONVERT(varchar(10),tagID)+',' FROM articleTag_tb 3 FOR XML PATH('')) AS tagID FROM articleTag_tb GROUP BY articleID 以上是一个表的,下面看看多表关联的做法,其实是一样的只是连接表查询这是一个文章对应多个标

灵活运用 SQL SERVER FOR XML PATH

FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主. 一.FOR XML PATH 简单介绍              那么还是首先来介绍一下FOR XML PATH ,假设现在有一张兴趣爱好表(hobby)用来存放兴趣爱好,表结构如下: 接下来我们来看应用FOR XML PATH的查询结果语句如下: SELECT * FROM @hobby FO

Sql server—— for xml path简单用法(可以按照分组把相同组的列中的不同的值,像字符串一样拼接在一起显示在分组之后的列中。)

一个表,然后语句如下 --查询 select id, name=stuff((select ','+name from tb where id=t.id for xml path('')),1,1,'') from tb t group by id 结果如下: 分组的时候 注意看清 id=t.id  .错误的情况会把所有的列加起来.非常尴尬.