请问:sql server实现类似mysql中group_concat功能

lazydot 2006-05-09 02:45:48
表a:
id name
a aa
b bb
c cc
. .
. .
表b:
id name a_id
1 11 a
2 22 a
3 33 b
4 44 c
5 55 a
. . .
现在要求是查询表a中的前15条记录信息,并且查询b中这15个记录中每个记录的前5条子记录信息
mysql中可以通过group_concat函数只需要一次查询就可以实现,查询的结果如下:
a_id a_name b_ids b_names
'a' 'aa' '1$2$5' '11$22$55'
'b' 'bb' '3' '33'
'c' 'cc' '4' '44'
其中'$'是group_concat函数的分隔符参数
...全文
2056 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lazydot 2006-05-09
  • 打赏
  • 举报
回复
表名参数化比较困难,用户定义函数内部除非执行扩展存储过程,否则不能使用execute
-------
这样啊,我不太懂sqlserver,呵呵.

是我搞错了,函数参数类型我只写了"varchar",应该写成"varchar(4)".
十分感谢两位.
lazydot 2006-05-09
  • 打赏
  • 举报
回复
表名参数化比较困难,用户定义函数内部除非执行扩展存储过程,否则不能使用execute
-------
这样啊,我不太懂sqlserver,呵呵.

是我搞错了,函数参数类型我只写了"varchar",应该写成"varchar(4)".
十分感谢两位.
子陌红尘 2006-05-09
  • 打赏
  • 举报
回复
比如子表名称、子表要查询的字段和子表要查询的个数可以由f_str函数参数传入,而非写死在函数里。
-------------------------------------------------------------------------------------------------------------------------------
表名参数化比较困难,用户定义函数内部除非执行扩展存储过程,否则不能使用execute。
子陌红尘 2006-05-09
  • 打赏
  • 举报
回复
create table a(id varchar(4),name varchar(4))
insert into a select 'a','aa'
insert into a select 'b','bb'
insert into a select 'c','cc'

create table b(id int,name varchar(4),a_id varchar(4))
insert into b select 1,'11','a'
insert into b select 2,'22','a'
insert into b select 3,'33','b'
insert into b select 4,'44','c'
insert into b select 5,'55','a'
go

create function f_str(
@id varchar(4), --a表的id
@type int ) --类型:1、返回b表id的汇总;2、返回b表name的汇总
returns varchar(200)
as
begin
declare @ret varchar(200)
set @ret=''
select top 5 @ret=@ret+'$'+case @type when 1 then rtrim(id) when 2 then rtrim(name) end
from b where a_id=@id
set @ret=stuff(@ret,1,1,'')
return isnull(@ret,'')
end
go


select
id as a_id,
name as a_name,
dbo.f_str(id,1) as b_id,
dbo.f_str(id,2) as b_name
from
a

/*
a_id a_name b_id b_name
---- ------ -------------------- --------------------
a aa 1$2$5 11$22$55
b bb 3 33
c cc 4 44
*/

drop function f_str
drop table a,b
itblog 2006-05-09
  • 打赏
  • 举报
回复
把函数改这样试试:
create function f_str(
@id int, --a表的id
type int) --类型:1、返回b表id的汇总;2、返回b表name的汇总
returns varchar(200)
as
begin
declare @ret varchar(200)
set @ret=''
select top 5 @ret=@ret+'$'+case type when 1 then rtrim(isnull(id,'')) when 2 then rtrim(isnull(name,'')) end
from b where a_id=@id
set @ret=stuff(@ret,1,1,'')
return @ret
end
go
lazydot 2006-05-09
  • 打赏
  • 举报
回复
之前有位给了解,但是不好用,查出来为NULL:
create function f_str(
@id int, --a表的id
type int) --类型:1、返回b表id的汇总;2、返回b表name的汇总
returns varchar(200)
as
begin
declare @ret varchar(200)
set @ret=''
select top 5 @ret=@ret+'$'+case type when 1 then rtrim(id) when 2 then rtrim(name) end
from b where a_id=@id
set @ret=stuff(@ret,1,1,'')
return @ret
end
go


select
id as a_id,
name as a_name,
dbo.f_str(id,1) as b_id,
dbo.f_str(id,2) as b_name
from
a


------------
上面是他的原解,但是创建函数出错,我把"type"替换为"@type"可以成功,但是查询结果为NULL.
哪位高手能否帮忙修改一下,变的通用一些.
比如子表名称、子表要查询的字段和子表要查询的个数可以由f_str函数参数传入,而非写死在函数里。

27,582

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧