SQL 合并多行记录的方法总汇

SQL中合并多行记录的方法总汇:

--1. 创建表,添加测试数据

CREATE TABLE tb(id int, [value] varchar(10))

INSERT tb SELECT 1, 'aa'

UNION ALL SELECT 1, 'bb'

UNION ALL SELECT 2, 'aaa'

UNION ALL SELECT 2, 'bbb'

UNION ALL SELECT 2, 'ccc'

--SELECT * FROM tb

/**//*

id value

----------- ----------

1 aa

1 bb

2 aaa

2 bbb

2 ccc

(5 row(s) affected)

*/

--2 在SQL2000只能用自定义函数实现

----2.1 创建合并函数fn_strSum,根据id合并value值

GO

CREATE FUNCTION dbo.fn_strSum(@id int)

RETURNS varchar(8000)

AS

BEGIN

DECLARE @values varchar(8000)

SET @values = ''

SELECT @values = @values + ',' + value FROM tb WHERE id=@id

RETURN STUFF(@values, 1, 1, '')

END

GO

-- 调用函数

SELECT id, VALUE = dbo.fn_strSum(id) FROM tb GROUP BY id

DROP FUNCTION dbo.fn_strSum

----2.2 创建合并函数fn_strSum2,根据id合并value值

GO

CREATE FUNCTION dbo.fn_strSum2(@id int)

RETURNS varchar(8000)

AS

BEGIN

DECLARE @values varchar(8000)

SELECT @values = isnull(@values + ',', '') + value FROM tb WHERE id=@id

RETURN @values

END

GO

-- 调用函数

SELECT id, VALUE = dbo.fn_strSum2(id) FROM tb GROUP BY id

DROP FUNCTION dbo.fn_strSum2

--3 在SQL2005/SQL2008中的新解法

----3.1 使用OUTER APPLY

SELECT *

FROM (SELECT DISTINCT id FROM tb) A OUTER APPLY(

SELECT [values]= STUFF(REPLACE(REPLACE(

(

SELECT value FROM tb N

WHERE id = A.id

FOR XML AUTO

), '<N value="', ','), '"/>', ''), 1, 1, '')

)N

----3.2 使用XML

SELECT id, [values]=STUFF((SELECT ','+[value] FROM tb t WHERE id=tb.id FOR XML PATH('')), 1, 1, '')

FROM tb

GROUP BY id

--4 删除测试表tb

drop table tb

/**//*

id values

----------- --------------------

1 aa,bb

2 aaa,bbb,ccc

(2 row(s) affected)

*/

时间: 2024-08-02 03:22:39

SQL 合并多行记录的方法总汇的相关文章

SQL 合并多行记录的方法总汇_MsSql

SQL中合并多行记录的方法总汇: --1. 创建表,添加测试数据 CREATE TABLE tb(id int, [value] varchar(10)) INSERT tb SELECT 1, 'aa' UNION ALL SELECT 1, 'bb' UNION ALL SELECT 2, 'aaa' UNION ALL SELECT 2, 'bbb' UNION ALL SELECT 2, 'ccc' --SELECT * FROM tb /**//* id value ---------

SQL 合并多行记录的相同字段值_MsSql

1.从数据库中先查询符合条件的记录,存放于一个DataTable中,在使用c#等开始遍历这张表,利用DataRow中的主键,再去读取相应的符合条件的多条记录,合并这些第二次读取到的记录内容,返回给前面的这个DataRow数据行.这样做没有错,但是如果数据量大,我们可能面临无数次的打开断开数据库链接,速度效率将会很低. 2.从数据库中一次读取数据到一张表中返回并显示到UI层.说起来谁都想这么做,但是以前太笨,没有去研究这个,今天因为数据量较大的原因,让我不得不想些其他办法来提高点效率. Googl

SQL 合并多行记录的相同字段值

1.从数据库中先查询符合条件的记录,存放于一个DataTable中,在使用c#等开始遍历这张表,利用DataRow中的主键,再去读取相应的符合条件的多条记录,合并这些第二次读取到的记录内容,返回给前面的这个DataRow数据行.这样做没有错,但是如果数据量大,我们可能面临无数次的打开断开数据库链接,速度效率将会很低. 2.从数据库中一次读取数据到一张表中返回并显示到UI层.说起来谁都想这么做,但是以前太笨,没有去研究这个,今天因为数据量较大的原因,让我不得不想些其他办法来提高点效率. Googl

mysql sql 语句插入多行记录简单方法

正常我们用sql执行 INSERT INTO `tabale` (`name`) VALUE ('name') 如果用php的执行这样的sql需要循环的,所以用下面执行一条sql语句插入多行记录. INSERT INTO `tabale` (`name`) VALUE ('name'),('name'),('name'),('name') 你想一次插入多少条添加多少条. 如果要向table1中插入5条记录,下面写法是错误的: INSERT INTO table1 (i) VALUES(1,2,3

在SQL中删除重复记录(多种方法)

重复|重复记录  学习sql有一段时间了,发现在我建了一个用来测试的表(没有建索引)中出现了许多的重复记录.后来总结了一些删除重复记录的方法,在Oracle中,可以通过唯一rowid实现删除重复记录:还可以建临时表来实现...这个只提到其中的几种简单实用的方法,希望可以和大家分享(以表employee为例). SQL> desc employee  Name                                      Null?    Type ------------------

SQL获取第一条记录的方法(sqlserver、oracle、mysql数据库)_MsSql

Sqlserver 获取每组中的第一条记录 在日常生活方面,我们经常需要记录一些操作,类似于日志的操作,最后的记录才是有效数据,而且可能它们属于不同的方面.功能下面,从数据库的术语来说,就是查找出每组中的一条数据.下面我们要实现的就是在sqlserver中实现从每组中取出第一条数据. 例子 我们要从上面获得的有效数据为: 对应的sql语句如下所示: select * from t1 t where id = (select top 1 id from t1 where grp = t.grp o

SQL获取第一条记录的方法(sqlserver、oracle、mysql数据库)

Sqlserver 获取每组中的第一条记录 在日常生活方面,我们经常需要记录一些操作,类似于日志的操作,最后的记录才是有效数据,而且可能它们属于不同的方面.功能下面,从数据库的术语来说,就是查找出每组中的一条数据.下面我们要实现的就是在sqlserver中实现从每组中取出第一条数据. 例子 我们要从上面获得的有效数据为: 对应的sql语句如下所示: select * from t1 t where id = (select top 1 id from t1 where grp = t.grp o

SQL触发器删除级联记录实现方法

比如,当我们删除新闻类别的时候,由于外键的原因,我们无法删除新闻类别下有新闻内容的记录,但是通过触发器,我们就可以实现.  代码如下 复制代码 delete from category where id=5  --sql删除语句 create trigger trigcategorydelete  --当执行sql删除语句时,执行触发器 on category after delete as begin delete news where caId=(select id from deleted

Oracle 多行记录合并/连接/聚合字符串的几种方法

怎么合并多行记录的字符串,一直是oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结.-什么是合并多行字符串(连接字符串)呢,例如: 1 SQL> desc test; 2 Name Type Nullable Default Comments 3 ------- ------------ -------- ------- -------- 4 COUNTRY VARCHAR2(20) Y 5 CITY VARCHAR2(20) Y 6 7