今天遇到了數據合併和拆分的問題,嘗試了幾種寫法。但大體可分爲兩類:1、原始寫法。2、Sql Server 2005以後支持的寫法。第一種寫法複雜並且效率低下,不推薦。因此下面具體講一下第二種寫法。html
再講拆分前,首先先介紹兩個函數:cross apply和outer 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 apply和outer 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
執行結果如圖所示: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
結果以下:code
本文來自:fang_beny (轉載請註明出處)server