本篇主要讲怎么利用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语句的查询结果为:
select str(student_id) + ',' + student_name from student for xml path('student')

查询结果:

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

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

select str(student_id) + ',' + student_name from student for xml path('')

查询结果:

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

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

4. 解答问题

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

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列进行拼接,再得用子查询功能。这样就得到一个每一个学生的所选的所有课程,由于上表会存在同一学生的多条记录,所以需要对最后的结果按学生进行分组,先看看查询语句:


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('') 参数非常强大!

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

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

    参考: http://www.cnblogs.com/repository/archive/2011/01/18/1938418.html select convert(varchar(10),c.[ ...

  2. 灵活运用 SQL SERVER FOR XML PATH 转

    灵活运用 SQL SERVER FOR XML PATH   FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些 ...

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

    经常在论坛看到高手使用了 for xml path,由于是搜索一下,记录了详细的使用方法.在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据,下面是它的一些应用 ...

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

    在一个医药行业的系统中需要根据患者的接触记录ID获取不同接触类型的集合,效果像这样     --患者接触记录信息,一个患者可以有N个不同的接触记录,每个接触记录又有N个接触类型记录 IF OBJECT ...

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

    灵活运用 SQL SERVER FOR XML PATH FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前 ...

  6. 二、sql新增后返回主键|sql 使用 FOR XML PATH实现字符串拼接|sql如果存在就修改不存在就新增

    一.sql新增后返回主键 1,返回自增的主键: INSERT INTO 表名 (字段名1,字段名2,字段名3,…) VALUES (值1,值2,值3,…) SELECT @@IDENTITY 2,返回 ...

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

    sql中经常需要把多个行数据合成一行下面是利用 FOR XML PATH来实现的简单介绍. 1,把图一的转换为图二: SELECT articleID, (),tagID)+',' FROM arti ...

  8. SQL Server FOR XML PATH 和 STUFF函数的用法

    FOR XML PATH ,其实它就是将查询结果集以XML形式展现,将多行的结果,展示在同一行. 下面我们来写一个例子: 假设我们有个工作流程表: CREATE TABLE [dbo].[Workfl ...

  9. Sql Server FOR XML PATH

    FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...

随机推荐

  1. Python3 编程之字符串处理

    Python3 编程之字符串处理 在编程中最常见的任务就是字符串的处理,So,学好字符串的使用非常重要 一.变量的定义规范 Python中声明变量时,要符合以下规则为准: 只能使用数字.字母.下划线组 ...

  2. API网关的用处

    API网关我的分析中会用到以下三种场景. Open API. 企业需要将自身数据.能力等作为开发平台向外开放,通常会以rest的方式向外提供,最好的例子就是淘宝开放平台.腾讯公司的QQ开发平台.微信开 ...

  3. kotlin之null值安全性

    var a: String =null // 编译错误 var a: String? =null // 编译通过 要允许null值, 需要将变量声明为可为null的字符串类型:String? fun ...

  4. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_17-CMS前端工程创建-单页面应用介绍

    查看运行起来的页面的源代码 这个webpck打包生成的文件. 单页面应用的优缺点: 优点: 1.用户操作体验好,用户不用刷新页面,整个交互过程都是通过Ajax来操作. 2.适合前后端分离开发,服务端提 ...

  5. bs4笔记

    1.网页输出乱码的解决办法 r= requests.get('https://www.baidu.com/') r.encoding = 'gbk2312'   #有可能 gbk.utf-8 soup ...

  6. JAVA 基础编程练习题44 【程序 44 偶数的素数和】

    44 [程序 44 偶数的素数和] 题目:一个偶数总能表示为两个素数之和. package cskaoyan; public class cskaoyan44 { @org.junit.Test pu ...

  7. 工具的更新换代 总是要折腾一下Windows10下Java Web 开发环境的配置

    Windows10下Java Web 开发环境的配置 由于经常性遗忘,所以整理一下 Java Web 开发环境的搭建与配置,利人利己 主要分为以下几步,需要可以挑着看 Windows下 JDK 的下载 ...

  8. Outlook2016中如何实现自动密送

    Outlook2016中如何实现自动密送 下面的方案您可以参考一下: 1)在Outlook里面键入Alt+F11打开VBA编辑器: 2)激活左边的工程面板,展开并双击上面的“Project (VbaP ...

  9. 编写expect程序报extra characters after close-brace错误或extra characters after close-quote,解决

    expect程序报extra characters after close-brace或extra characters after close-quote 可能原因 流程控制语句中的"{& ...

  10. mysql5.6.36 编译报错make[1]: *** [storage/perfschema/unittest/CMakeFiles/pfs_connect_attr-t.dir/all]..

    cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/data/mysqldb -DMYSQL_UNIX_ADDR=/tmp/m ...