• (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
    第二种写法--xml分割

    执行结果如图所示:

    数据的合并:

         在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
    View Code

    结果如下:

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

  • 相关阅读:
    周鸿祎:很多程序员聪明,但我一看就知道他不会成功
    Ubuntu/centos/redhat/SUSE sipp安装(带rtp支持,3.5.1版本)
    ffmpeg源码分析之媒体打开过程
    搜集的动植物分类、检索网站
    sipp命令 各参数含义
    最简单的一个win32程序
    vi学习笔记
    删除结点 (双向链表)
    插入结点(双向链表)
    La=LaULb (单链表)
  • 原文地址:https://www.cnblogs.com/fang-beny/p/3255171.html
Copyright © 2020-2023  润新知