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

背景:

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

数据的拆分:

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

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,如图所示

 

 

 


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

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
复制代码

执行结果如图所示:

数据的合并:

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

现需要将其进行Group by id进行数据合并,怎么做?

具体的sql如下:

复制代码
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
复制代码

结果如下:

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQL Server,如果要拆分多行数据,可以使用多种方法,以下是其几种常用的方法: 1. 递归CTE(公共表达式):使用递归CTE可以将多行数据逐行拆分成单行,并将其放入一个新的数据。具体步骤如下: - 创建递归CTE,将原始表作为初始查询结果。 - 在递归查询使用UNION ALL将每一行划分成两个部分,一部分是当前行的某个拆分值,另一部分是剩余行的拆分结果。 - 逐步递归,直到没有剩余行为止。 - 使用组合窗口函数(如STRING_AGG)将递归CTE的拆分合并一个字符串。 2. 使用自定义函数:可以编写自定义函数来拆分多行数据。函数的输入参数为多行数据,输出参数为拆分后的单行数据。具体步骤如下: - 创建一个函数,接受多行数据作为参数。 - 在函数内部,使用循环结构(如WHILE)逐行读取输入数据,并将其拆分成单行。 - 使用临时表或表变量保存单行数据。 - 循环结束后,将临时表或表变量数据合并一个字符串。 3. 使用XML PATH方法:利用SQL Server的FOR XML PATH语句可以将多行数据拼接成XML格式,并将其合并一个字符串。具体步骤如下: - 使用SELECT语句查询出多行数据,并使用FOR XML PATH语句将其转换为XML格式。 - 使用XML格式的数据进行拆分,将其拼接成一个字符串。 总之,SQL Server可以使用递归CTE、自定义函数或XML PATH方法来拆分多行数据。具体选择哪种方法取决于具体的需求和数据结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值