【SQL】通过Sql实现根据分组合并指定列内容的查询 SamWang
问题:
最近在做一个项目的时候,遇到这样一个要求,模拟要求如下:
ID SName 1 张三 1 李四 2 刘六 2 王五 要的结果是 ID name 1 张三,李四 2 刘六,王五 即按ID组查询,并将相同的ID对应SName内容通过逗号合并
解决思路:
通过传递不同的id给函数,查询出组合的SName并返回。
--创建测试表 IF NOT EXISTS(SELECT * FROM sysobjects WHERE id=OBJECT_ID(N'StudentsInfo') AND OBJECTPROPERTY(id,N'IsUserTable')=1) CREATE TABLE StudentsInfo ( Id INT, SName NVARCHAR(20) ) GO --添加测试数据 INSERT INTO StudentsInfo VALUES (1,'张三') INSERT INTO StudentsInfo VALUES (1,'李四') INSERT INTO StudentsInfo VALUES (2,'刘六') INSERT INTO StudentsInfo VALUES (2,'王五') GO --创建函数 IF EXISTS(SELECT * FROM sysobjects WHERE id=OBJECT_ID(N'GetStudentsInfoNamesByID') AND OBJECTPROPERTY(id,N'IsScalarFunction')=1) DROP FUNCTION GetStudentsInfoNamesByID GO CREATE FUNCTION GetStudentsInfoNamesByID(@Id INT) RETURNS NVARCHAR(4000) AS BEGIN DECLARE @SNames NVARCHAR(4000) SET @SNames = '' SELECT @SNames = @SNames+','+SName FROM StudentsInfo WHERE id = @Id RETURN STUFF(@SNames,1,1,'') END GO --查询 SELECT id,dbo.GetStudentsInfoNamesByID(id) AS SNames FROM StudentsInfo GROUP BY id
总结:
整体思路还是比较简单的,但是很多时间都不怎么使用函数进行处理,这里也算抛砖引玉做个记录。至于上面的效率问题怎么样,就暂不做考虑了。
链接:
下面这两篇博文很不错,用三种方法实现上面的要求,而且还有效率的对比,很细致,推荐一下!(感谢 CrazyJinn的分享)
关于SQL函数效率的一些测试与思考
关于SQL一对多关系转换的效率思考(续)