最近遇到需要将关联表中的某个字段全部查询出来并且重新组合为一个字段,这个时候普通的连接查询就满足不了需求了,需要用到SQL函数来完成:
1
2
3
4
5
6
7
8
9
|
ALTER function dbo.getResCodesByOwnerId(@OwnerId INT )
returns nvarchar(2000)
as
begin
DECLARE @codes VARCHAR (2000)
SET @codes= ''
select @codes=stuff(( select ',' +residence_code from crm_owner co left join crm_owner_residence cor on co.id=cor.owner_id where co.id=@OwnerId for xml path( '' )),1,1, '' )
return @codes
END
|
拿id = 2 的数据来做测试,得到结果:
1
2
|
select (数据库名).getResCodesByOwnerId(fr.owner_id) as room_code
from t1 fr left join t2 frd on fr.owner_id=frd.owner_id
|
结果:
1
|
1101010105,11GU002,1101010104
|
补充:SQL STUFF函数 拼接字符串
今日看到一篇文章,是关于和并列的,也研究了下,还是不错的
要这种效果。
1
2
3
4
5
6
7
8
9
|
create table tb(idint, value varchar (10))
insert into tbvalues(1, 'aa' )
insert into tbvalues(1, 'bb' )
insert into tbvalues(2, 'aaa' )
insert into tbvalues(2, 'bbb' )
insert into tbvalues(2, 'ccc' )
go
/* stuff(param1, startIndex, length, param2)
|
说明:将param1中自startIndex(SQL中都是从1开始,而非0)起,删除length个字符,然后用param2替换删掉的字符。*/
1
2
3
4
5
6
7
|
SELECT id,
value = stuff
(( SELECT ',' + value
FROM tb AS t
WHERE t .id = tb.id FOR xml path( '' )), 1, 1, '' )
FROM tb
GROUP BY id
|
这样即可。
收集的资料
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
/*
标题:按某字段合并字符串之一(简单合并)
作者:(十八年风雨,守得冰山雪莲花开)
地点:广东深圳
描述:将如下形式的数据按id字段合并value字段。
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id value
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即: group by id, 求 value 的和(字符串相加)
*/
--1、sql2000中只能用自定义的函数解决
create table tb(id int , value varchar (10))
insert into tb values (1, 'aa' )
insert into tb values (1, 'bb' )
insert into tb values (2, 'aaa' )
insert into tb values (2, 'bbb' )
insert into tb values (2, 'ccc' )
go
create function dbo.f_str(@id varchar (10)) returns varchar (1000)
as
begin
declare @str varchar (1000)
select @str = isnull (@str + ',' , '' ) + cast (value as varchar ) from tb where id = @id
return @str
end
go
--调用函数
select id , value = dbo.f_str(id) from tb group by id
drop function dbo.f_str
drop table tb
--2、sql2005中的方法
create table tb(id int , value varchar (10))
insert into tb values (1, 'aa' )
insert into tb values (1, 'bb' )
insert into tb values (2, 'aaa' )
insert into tb values (2, 'bbb' )
insert into tb values (2, 'ccc' )
go
select id, [value] = stuff(( select ',' + [value] from tb t where id = tb.id for xml path( '' )) , 1 , 1 , '' )
from tb
group by id
drop table tb
--3、使用游标合并数据
create table tb(id int , value varchar (10))
insert into tb values (1, 'aa' )
insert into tb values (1, 'bb' )
insert into tb values (2, 'aaa' )
insert into tb values (2, 'bbb' )
insert into tb values (2, 'ccc' )
go
declare @t table (id int ,value varchar (100)) --定义结果集表变量
--定义游标并进行合并处理
declare my_cursor cursor local for
select id , value from tb
declare @id_old int , @id int , @value varchar (10) , @s varchar (100)
open my_cursor
fetch my_cursor into @id , @value
select @id_old = @id , @s= ''
while @@FETCH_STATUS = 0
begin
if @id = @id_old
select @s = @s + ',' + cast (@value as varchar )
else
begin
insert @t values (@id_old , stuff(@s,1,1, '' ))
select @s = ',' + cast (@value as varchar ) , @id_old = @id
end
fetch my_cursor into @id , @value
END
insert @t values (@id_old , stuff(@s,1,1, '' ))
close my_cursor
deallocate my_cursor
select * from @t
drop table tb
|
以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。如有错误或未考虑完全的地方,望不吝赐教。
原文链接:https://blog.csdn.net/Megamind_HL/article/details/79977566