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 ,
                        ‘001‘ AS ty
               UNION ALL
               SELECT   1 AS id ,
                        ‘002‘ AS ty
               UNION ALL
               SELECT   2 AS id ,
                        ‘003‘ AS ty
               UNION ALL
               SELECT   3 AS id ,
                        ‘004‘ AS ty
               UNION ALL
               SELECT   3 AS id ,
                        ‘1234‘ AS ty
               UNION ALL
               SELECT   4 AS id ,
                        ‘01‘ AS ty
               UNION ALL
               SELECT   4 AS id ,
                        ‘005‘ AS ty
               UNION ALL
               SELECT   4 AS id ,
                        ‘006‘ 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 ,
                        ‘003‘ 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

时间: 2024-08-02 05:52:17

FOR XML PATH 应用及其反向分解的相关文章

灵活运用 SQL SERVER FOR XML PATH

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

SQL FOR XML PATH 和 Stuff 用法

sql stuff 用法 1.作用 删除指定长度的字符,并在指定的起点处插入另一组字符. 2.语法 STUFF ( character_expression , start , length ,character_expression ) 3.示例 以下示例在第一个字符串 abcdef 中删除从第 2 个位置(字符 b)开始的三个字符,然后在删除的起始位置插入第二个字符串,从而创建并返回一个字符串 SELECT STUFF('abcdef', 2, 3, 'ijklmn')GO 下面是结果集 a

行转列(FOR XML PATH)

SELECT (SELECT ac.ColName+',' FROM T1 AS ac FOR XML PATH('')) AS ColName, (SELECT ac.colTitle+',' FROM T1 AS ac FOR XML PATH('')) AS colTitle 行转列(FOR XML PATH),布布扣,bubuko.com

for xml path

在SQL Server中利用 FOR XML PATH 语句能够把查询的数据生成XML数据 示例:

使用for xml path 分组查询

SELECT OLevel, WorkOrgID, WorkOrgName, PlanNum, PlanFinishNum, PlanUnFinishNum, PlanCanceledNum, PlanChangedNum, OrtherNum, PlanTime, ActualTime, RIGHT(PlanIDs,LEN(PlanIDs)-1) AS PlanIDs FROM (SELECT ( CASE MIN(Parent) WHEN 'E13744A1-7E2C-42E8-8E7B-4

sql FOR XML PATH('')

alter function test() Returns nvarchar(max) As Begin Declare @avg nvarchar(max) Declare @str nvarchar(max) Set @str=( Select ','+yuanshidanhao from Aj_Jibenxinxi Where convert(nvarchar(max),id) in (1,2,6) FOR XML PATH('') ) Return @str End sql FOR XM

SqlServer——for xml path

for xml path 就是将 sql 查询出来的内容以XML的格式显示出来.参考网站MSDN:将 PATH 模式与 FOR XML 一起使用. 先创建测试用的表格: create table SZQCSBJ ( 省 varchar(100), 市 varchar(100), 县 varchar(100) ); insert into SZQCSBJ values('山东' ,'潍坊' ,'安丘' ); insert into SZQCSBJ values('山东' ,'潍坊','寿光' );

初识FOR XML PATH

今天公司升级考试(我打酱油的熟悉下),结果第一题就熄火了,大概是这样的: 一张学生表,列分别为(stuID,sName,hobby),stuID代表学生编号,sName代表学生姓名,hobby列存学生的爱好 要求是查询学生表,显示所有学生的爱好的结果集 我在那搞了半天没搞出来,过后问了下同事,他说用FOR XML PATH,搞了下出来了 SELECT B.sName,LEFT(StuList,LEN(StuList)-1) as hobby FROM ( SELECT sName, (SELEC

SQL SERVER FOR XML PATH

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