一、資料庫sql server列值鏈式合併
需求:原始表的資料的結構如圖1所示,把相同guid的code值生成乙個鏈式字串。
(圖1)
目標:我們希望達到的效果如圖2所示,這裡的guid變成唯一的了,這行的記錄中包含了這個guid所對應的code字段值的鏈式字串。
(圖2)
分析與實現:要實現圖1到圖2的轉變,這使用sql server 2005的新功能:xml,下面我們來講講具體的實現:
1. 首先我們先建立乙個測試表,方便後面的效果展現;
--建立表
ifexists (
select
*from sysobjects where id
=object_id(
'[temptable_base]') and objectproperty(id, 'isusertable') = 1)
drop table [temptable_base]
create table [temptable_base] (
[id] [
int] identity (1,
1)
notnull
,[guid] [varchar] (
50)
null
,[code] [varchar] (
50)
null
)set
identity_insert [temptable_base]
oninsert [temptable_base] ([id],[guid],[code]) values ( 1,
'91e92dcb-141a-30b2-e6cd-b59eabd21749','a')
insert [temptable_base] ([id],[guid],[code]) values ( 2,
'91e92dcb-141a-30b2-e6cd-b59eabd21749','c')
insert [temptable_base] ([id],[guid],[code]) values ( 3,
'91e92dcb-141a-30b2-e6cd-b59eabd21749','e')
insert [temptable_base] ([id],[guid],[code]) values ( 4,
'91e92dcb-141a-30b2-e6cd-b59eabd21749','o')
insert [temptable_base] ([id],[guid],[code]) values ( 5,
'91e92dcb-141a-30b2-e6cd-b59eabd21749','g')
insert [temptable_base] ([id],[guid],[code]) values ( 6,
'79dd7ab9-ce57-9431-b020-df99731fc99d','a')
insert [temptable_base] ([id],[guid],[code]) values ( 7,
'79dd7ab9-ce57-9431-b020-df99731fc99d','o')
insert [temptable_base] ([id],[guid],[code]) values ( 8,
'79dd7ab9-ce57-9431-b020-df99731fc99d','e')
insert [temptable_base] ([id],[guid],[code]) values ( 9,
'79dd7ab9-ce57-9431-b020-df99731fc99d','f')
insert [temptable_base] ([id],[guid],[code]) values ( 10,
'79dd7ab9-ce57-9431-b020-df99731fc99d','o')
insert [temptable_base] ([id],[guid],[code]) values ( 11,
'79dd7ab9-ce57-9431-b020-df99731fc99d','b')
insert [temptable_base] ([id],[guid],[code]) values ( 12,
'79dd7ab9-ce57-9431-b020-df99731fc99d','d')
insert [temptable_base] ([id],[guid],[code]) values ( 13,
'79dd7ab9-ce57-9431-b020-df99731fc99d','f')
insert [temptable_base] ([id],[guid],[code]) values ( 14,
'd61651d9-1b0a-0362-ee91-a805aa3e08f2','o')
insert [temptable_base] ([id],[guid],[code]) values ( 15,
'd61651d9-1b0a-0362-ee91-a805aa3e08f2','d')
insert [temptable_base] ([id],[guid],[code]) values ( 16,
'd61651d9-1b0a-0362-ee91-a805aa3e08f2','f')
insert [temptable_base] ([id],[guid],[code]) values ( 17,
'd61651d9-1b0a-0362-ee91-a805aa3e08f2','c')
insert [temptable_base] ([id],[guid],[code]) values ( 18,
'd61651d9-1b0a-0362-ee91-a805aa3e08f2','u')
insert [temptable_base] ([id],[guid],[code]) values ( 19,
'd61651d9-1b0a-0362-ee91-a805aa3e08f2','f')
insert [temptable_base] ([id],[guid],[code]) values ( 20,
'4802f0cd-b53f-a3f5-1c78-2d7424579c06','a')
insert [temptable_base] ([id],[guid],[code]) values ( 21,
'3ccbff9f-827b-6639-4780-da7215166728','o')
insert [temptable_base] ([id],[guid],[code]) values ( 22,
'3ccbff9f-827b-6639-4780-da7215166728','m')
insert [temptable_base] ([id],[guid],[code]) values ( 23,
'3ccbff9f-827b-6639-4780-da7215166728','c')
insert [temptable_base] ([id],[guid],[code]) values ( 24,
'3ccbff9f-827b-6639-4780-da7215166728','m')
setidentity_insert [temptable_base] off
select
*from [temptable_base]
2. 使用sql server2005的for xml path把記錄資料以xml的格式組織起來,把同乙個guid的資料進行字串的拼湊。執行下面的sql就可以達到圖3所示的效果了。
--列值鏈式合併
(圖3)
3. 上面的sql語句的意思是:
假設以guid為91e92dcb-141a-30b2-e6cd-b59eabd21749為例,那麼guid=a.guid就是先找出值為91e92dcb-141a-30b2-e6cd-b59eabd21749的記錄,並進行order by id的排序,拿出了這5行記錄以逗號的形式生成鏈式字串(for xml path(''))。
二、參考文獻
for xml path 語句的應用
sql多行轉為一列的合併問題,並在sql2000和2005得到驗證
SQL 多行轉一列
1 建立表 create table dbo a id nchar 10 collate chinese prc ci as null,name nchar 10 collate chinese prc ci as null,value nchar 10 collate chinese prc ci...
Sql2005轉Sql2000實用工具
相信大家都有資料庫公升級或者降級的經歷,這裡把資料庫轉化的過程發布一下,方便以後進行資料庫版本的公升級操作。一 從sql2000公升級成sql2005 做法如下 1 把sql server 2000的資料庫backup,做成乙個bak的備份檔案 2 在sql server 2005中新建資料庫,然後...
實用SQL語句
1 將乙個表中的內容拷貝到另外乙個表中 insert intotestt1 a1 b1,c1 selecta,b cfromtest insert intotesttselect fromtest 前提是兩個表的結構完全相同 insert intonotebook id title content ...