SQL 将一列多行数据合并为一行 FOR XML PATH
FOR XML PATH 方法是用于将查询结果集以XML形式展示,这样展示方式的好处不言而喻。现在我要介绍的FOR XML PATH的“另类”用法。
首先,我们先来看看它的正常用法。下图是我们用到的一张TEST_PERSON表:

用FOR XML PATH方法查询,SQL语句如下:
SELECT * FROM TEST_PERSON FOR XML PATH
显示结果如下:

展开结果可以看到如下图:

神奇吧!!!!细心的同学会注意到这个XML文件的行节点是<row>,如果需求需要改变这个行节点为<animal>,怎么改?看下面的SQL语句你就会知道了。
SELECT * FROM TEST_PERSON FOR XML PATH('animal')
展开结果如下图:

简单吧!!!有野心的同学就会说了:既然行节点可以改变,那列节点要改变又该怎么操作呢?很简单,只要给字段加别名。SQL语句如下:
SELECT ID AS XuHao,NAME AS MyName FROM TEST_PERSON FOR XML PATH('animal')
展开结果如下:

好玩吧!!!古怪的同学就想了:既然行和列都可以自定义,那么是否说我们可以定义我们喜欢的输出方式呢?!(我们要说的重点就是这)
看如下SQL语句:
SELECT '['+NAME+']' +' 'FROM TEST_PERSON FOR XML PATH('')
展示结果如下:

说了这么多,好像只是为了好玩。那么有哪些实际的应用场景中可以用到这个技术呢?
例如:要查询一个订单信息,这些信息包括(订单号+费用名称+...),而费用我们是存在单独的一个子表中,且一个订单不只一笔费用。
接下来我们增加个动物的行为表TEST_HOBBY表,用演示以上效果。TEST_HOBBY表如下:

我们查动物信息(动物名字+动物行为),动物行为存在TEST_HOBBY表中,我们通过ID 关联,并且一个动物存在多种行为。SQL语句如下:
SELECT
PE.NAME,--取出TEST_PERSON表中的NAME字段
--通过ID关联到TEST_HOBBY表,并把这表中各种动物的行为拼接为一个字段返回
(SELECT ' '+HO.HOBBY_NAME+' ' FROM TEST_HOBBY HO WHERE HO.PARENT_ID=PE.ID FOR XML PATH('')) AS HOBBY
FROM TEST_PERSON PE
结果展示如下:

好玩吧,O(∩_∩)O哈哈~
更多知识可以参考: http://msdn.microsoft.com/zh-cn/library/ms189885.aspx
(今天写存储过程时用到了FOR XML PATH方法,所以整理一下FOR XML PATH的知识。)
原文地址:
SQL 将一列多行数据合并为一行 FOR XML PATH的更多相关文章
- T SQL 将一列多行数据合并为一行
SQL Server 在进行数据迁移和报表处理的时候遇到将一列多行数据拼接为一个字符串的情形,查找相关的资料整理如下,提供两种方法. Table:SC Student Course 张三 大学语文 李 ...
- SQL 将一列多行数据合并为一行
原表数据: 期望结果: 使用STUFF + FOR XML PATH即可实现以上效果 执行以下SQL: , , '') AS Course FROM Student AS T 可以看到输出结果与期望结 ...
- T_SQL 将一列多行数据合并为一行
SQL Server在进行数据迁移和报表处理的时候会遇到将一列多行数据拼接为一个字符串的情况,为了处理这个问题,在网上找了一些相关的资料,提供两种方法,供遇到类似问题的朋友们参考,也借此加深自己的印象 ...
- SQL将多行数据合并成一行【转】
转:https://blog.csdn.net/AntherFantacy/article/details/83824182 今天同事问了一个需求,就是将多行数据合并成一行进行显示,查询了一些资料,照 ...
- 使用Notepad++将多行数据合并成一行
1.按Ctrl+F,弹出“替换”的窗口: 2.选择“替换”菜单: 3.“查找目标”内容输入为:\r\n: 4.“替换为”内容为空: 5.“查找模式”选择为正则表达式: 6.设置好之后,点击“全部替换” ...
- SQL SERVER 如何把1列多行数据 合并成一列显示
示例 修改前:1列多行数据 修改后:合并成一列 示例语句 1 2 3 4 5 6 7 8 9 10 11 select 类别, 名称 = ( stuff( ...
- sql查询 ,多行数据合并成一行,并且显示合并后某一列的值拼接结果
select [value] = stuff((select ','+modmb003 from modmb detail where modmb=18 for xml path('')), 1, ...
- SQL SERVER将多行数据合并成一行(转载)
昨天遇到一个SQL Server的问题:需要写一个储存过程来处理几个表中的数据,最后问题出在我想将一个表的一个列的多行内容拼接成一行 比如表中有两列数据 : ep_classes ep_name A ...
- SQL实用技巧:如何将表中某一列的部分数据合并到一行中
select *,stuff(select ‘,’ + fieldname from table1 for xml path(”)),1,1,”) as field from table2 for ...
随机推荐
- IOS(SystemConfiguration)框架中关于测试连接网络状态相关方法
1. 在SystemConfiguration.famework中提供和联网相关的function, 可用来检查网络连接状态. 2. SC(SystemConfiguration)框架中关于测试连接网 ...
- C语言数据类型在IA32中的大小
这个主要是一些常识问题,以及在使用AT&T语法汇编时会使用的编码后缀: C声明 Intel数据类型 汇编后缀 大小(byte) char 字节 b 1 short 字 w 2 int ...
- LeetCode---- 二叉树中,找出和为某值的所有路径
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- windows socket网络编程基础知识
下面介绍网络7层协议在WINDOWS的实现: 7层协议 WIN系统 ________________________________________ 7 应用层 7 应用程序 ____________ ...
- 错误处理:加载文件或程序集“ICSharpCode.SharpZipLib”
解决方案:如果你的程序是2.0的,则删除 C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/中的所有的文件 如果是4.0的,删除C:/WINDOWS/Micr ...
- 【题解】【BT】【Leetcode】Binary Tree Level Order Traversal
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, ...
- 帝国cms缩略图:网站不同地方生成不同的缩略图
本文转自:http://blog.sina.com.cn/s/blog_4d49ba58010115sd.html 方便网站多地方调用不同尺寸的缩略图. 根据图片源,在网站任意位置生成不同大小的缩略图 ...
- 帝国cms教程:帝国cms在列表页使用sys_ResizeImg函数自动生成不同大小的缩略图
先说说 ecms7.0的sys_ResizeImg这个函数 下面是在列表页使用方法 在右侧把使用程序代码打勾! 如下图: 例如你原先的列表页循环内容代码为: <li><img src ...
- python报错
报错1 UnboundLocalError: local variable 'x' referenced before assignment 定义了一个全局参数,但是在函数中直接改变参数值,就会报这个 ...
- Java多线程的实现
记得面试的时候,面试官问了Java多线程实现的方式有几种,它们之间的区别是什么?作为一个Java新手,将最近的学习总结如下: 1.Java多线程实现方式 Java多线程实现方式主要有三种:继承Thre ...