FOR XML PATH 应用及其反向分解
数据库环境:SQL SERVER 2005
我们实现将同一组的数据内容合并到一行的时候,可以通过FOR XML PATH来实现。
有数据如图1,要实现图2的效果

1.图1到图2的FOR XML PATH实现
网上有很多介绍FOR XML的方法,这里不再细说,感兴趣的朋友可以去查询一下它的用法。
--数据准备
;WITH x0
AS ( SELECT 1 AS id ,
'' AS ty
UNION ALL
SELECT 1 AS id ,
'' AS ty
UNION ALL
SELECT 2 AS id ,
'' AS ty
UNION ALL
SELECT 3 AS id ,
'' AS ty
UNION ALL
SELECT 3 AS id ,
'' AS ty
UNION ALL
SELECT 4 AS id ,
'' AS ty
UNION ALL
SELECT 4 AS id ,
'' AS ty
UNION ALL
SELECT 4 AS id ,
'' AS ty
)
/*实现*/
SELECT id ,
STUFF(ty, 1, 1, '') AS ty
FROM ( SELECT id ,
( SELECT ',' + x2.ty
FROM x0 x2
WHERE x2.id = x1.id
FOR
XML PATH('')
) AS ty
FROM x0 x1
GROUP BY id
) t
2.图2到图1的递归实现
从图2到图1,实现的方法不止递归一种方法,各位可以试着用其它方法解决。
/*准备数据*/
WITH x0
AS ( SELECT 1 AS id ,
'001,002' AS ty
UNION ALL
SELECT 2 AS id ,
'' AS ty
UNION ALL
SELECT 3 AS id ,
'004,1234' AS ty
UNION ALL
SELECT 4 AS id ,
'01,005,006' AS ty
),
x1 ( id, ty1, ty2 )
AS ( SELECT id ,
CASE WHEN CHARINDEX(',', ty, 1) > 0
THEN CONVERT(VARCHAR(10), LEFT(ty,
CHARINDEX(',', ty,
1) - 1))
ELSE ty
END AS ty1 ,--本次拆分字符
CASE WHEN CHARINDEX(',', ty, 1) > 0 THEN
STUFF(ty + ',', 1, CHARINDEX(',', ty), '')
ELSE NULL
END AS ty2--待拆分字符串
FROM x0
UNION ALL
SELECT id ,
CONVERT(VARCHAR(10), LEFT(ty2,
NULLIF(CHARINDEX(',', ty2, 1),
0) - 1)) AS ty1 ,--本次拆分字符
STUFF(ty2, 1, CHARINDEX(',', ty2), '') AS ty2--待拆分字符串
FROM x1
WHERE CHARINDEX(',', ty2, 1) > 0
)
SELECT id,ty1 AS ty
FROM x1 ORDER BY id
FOR XML PATH 应用及其反向分解的更多相关文章
- Entity framewok 如何实现多条记录作为一条取出, for xml path如何实现
http://www.myexception.cn/linq/1288046.html Entity framewok 怎么实现多条记录作为一条取出, for xml path怎么实现News表:ID ...
- for xml path 将单表中一个字段用逗号分隔
我也是才知道这种用法的,刚好又用到写个简单的例子. select Name from tc_order_detail 如下表,现在要将做到将name每个以逗号连接 declare @df nvarch ...
- SQL Server 2008 R2——使用FOR XML PATH实现多条信息按指定格式在一行显示
=================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的“联系邮 ...
- Sql Server FOR XML PATH
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...
- Sql Server 之 for xml (path,raw,auto,root)
1.for xml path('str') select ID,CreateTime from dbo.ArticleInfo for xml Path('mytitle') 结果:(注意:如果是s ...
- 灵活运用 SQL SERVER FOR XML PATH
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...
- 转王波洋,SQL语句中的 for XML Path('')
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...
- sqlserver -- 学习笔记(八)体验charindex、stuff 和 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.[ ...
随机推荐
- 关注LoadRunner脚本回放日志中的Warning信息-转载
关注LoadRunner脚本回放日志中的Warning信息 最近在与大家的讨论中发现了LoadRunner的很多问题,出于解决问题的出发点,我也就相关自己不理解的问题在Google中搜索了一番,并 ...
- Entity Framework 杂碎
其实看图很简单,database first和model first都是通过 data model创建的edmx文件,只不过model first模块可以自己根据需要创建和修改实体,显得更加灵活. c ...
- oracle 中的truncate 和delete
一.查询表大小,块多少语句 Select SEGMENT_Name,BYTES,BLOCKS,Extents From dba_segments Where segment_name In('BAI_ ...
- bzoj 1483 [HNOI2009]梦幻布丁(链表+启发式合并)
1483: [HNOI2009]梦幻布丁 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1818 Solved: 761[Submit][Status ...
- 【原创】关于hashcode和equals的不同实现对HashMap和HashSet集合类的影响的探究
这篇文章做了一个很好的测试:http://blog.csdn.net/afgasdg/article/details/6889383,判断往HashSet(不允许元素重复)里塞对象时,是如何判定set ...
- Blot消息处理者
- 开始使用storm
开始使用storm 本章将讲述如何安装.部署.启动和停止 Storm 集群. Storm 的安装比较简单,但在安装 Storm 之前需要做好充足的准备,本章将介绍安装的整个流程.在官网上可以下载到S ...
- 理解SQL Server中索引的概念
T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他 简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能 ...
- zend studio-字体大小设置
在使用zend studio的过程中为了方便我们编码,很多时候需要设置编码的字体的大小,设置步骤如下: 选择[Windows]-[preference]-[general]-[appearance]- ...
- 礼仪或许就是尊重的还有一个说法——leo鉴书61
<Leo鉴书(第1辑)>已登陆百度阅读,今后还将不断更新,免费下载地址:http://t.cn/RvawZEx 礼仪从字面上就区分成"礼"和"仪"两 ...