(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

相關文章
相關標籤/搜索