(Sql Server)数据的拆分和合并

背景:

     今天遇到了数据合并和拆分的问题,尝试了几种写法。但大体可分为两类:1、原始写法。2、Sql Server 2005以后支持的写法。第一种写法复杂并且效率低下,不推荐。因此下面具体讲一下第二种写法。html

数据的拆分:

     再讲拆分前,首先先介绍两个函数:cross applyouter apply。这两个函数做用是交叉链接。这两个函数是在sql server 2005以后才有的,在2000与之类似的功能是cross join。虽然类似,可是cross join有一个致命功能缺陷。详看代码:node

SELECT * FROM TEST01 AS T01 CROSS JOIN  FUNC_TB2(T01.FIELD1)
--FUNC_TB2为表值函数

执行此sql后,将报错。详细错误信息,以下:Msg 4104, Level 16, State 1, Line 1.The multi-part identifier "T01.FIELD1" could not be bound。因而可知,cross join不能接受由TEST01传过去的值。因为cross join这样的缺陷,因此sql server 在2005版本后新增了cross applyouter apply,两者能够彻底弥补这一缺陷。cross apply虽然与outer apply功能类似,可是两者也有不一样。cross apply与FUNC_TB2交集的结果将去除右边NULL项,而outer apply将包括NULL项。
     上面,咱们具体讲了两个函数的具
体用法,下面讲一下根据以上函数如何进行拆分。现有这样一个Case:有一张表aaa,如图所示sql

 

 

 


,现须要将name字段中的数据拆分出来。面对这样的case咱们两步作。第一步,须要分割字符串;第二步,和id进行关联。经过以上指导方针造成两种sql语句。app

SELECT 
    id
   ,t02.item 
FROM  dbo.aaa AS t01 CROSS apply dbo.Split(t01.name,',') AS t02
--dbo.Split为自定义的字符串分割函数,这个能够本身定义
第一种写法--表值函数分割

 

SELECT 
    tb01.id
   ,tb02.VALUE 
FROM( 
        SELECT 
            id
           ,[value] = CONVERT(xml,'<root><v>' + REPLACE(name, ',', '</v><v>') + '</v></root>') 
        FROM dbo.aaa ) AS tb01 
OUTER APPLY( 
                SELECT 
                    VALUE = N.v.VALUE('.', 'varchar(100)') FROM tb01.[value].nodes('/root/v'
             ) N(v) ) AS tb02
第二种写法--xml分割

执行结果如图所示:ide

数据的合并:

     在2005版本出来以前,数据合并是一件很麻烦的事情并且效率低下。如今具体讲一下05以后的具体作法,即经过xml操做执行。Case以下:现有一张表bbb,如图所示:函数

现须要将其进行Group by id进行数据合并,怎么作?spa

具体的sql以下:3d

SELECT 
    id
   ,stuff((
        SELECT 
            ','+CLASS 
        FROM dbo.bbb AS tb01 where tb01.id=tb02.id
        FOR xml PATH('')),1,1,'') AS classList 
 FROM  dbo.bbb AS tb02 
 GROUP BY id
View Code

结果以下:code

 

 本文来自:fang_beny (转载请注明出处)server

相关文章
相关标签/搜索