Concanate行凭身份证像一个表
答
设置:
create table mytab
(id varchar(10)
,b varchar(30))
go
insert mytab values ('233.263','DDDD')
insert mytab values ('233.263','AAAAAQ')
insert mytab values ('233.283','22223')
insert mytab values ('233.283','333333')
go
-- #lists will hold intermediate results
create table #lists
(id varchar(10)
,b_list varchar(1000))
go
宣布我们的光标:
注:OP未说明b
列的值是如何进行排序,所以我们会用这个例子字母排序坚持。
declare mycur cursor
for
select id,b
from mytab
order by id,b
for read only
go
循环通过光标,追加b
值@b_list
为每个不同的id
:
declare @id varchar(10),
@id_old varchar(10),
@b varchar(30),
@b_list varchar(1000)
select @id_old = NULL
open mycur
fetch mycur into @id, @b
while @@sqlstatus = 0
begin
-- if new @id value, save old @id/@b_list pair
if @id != isnull(@id_old,'UNDEFINED')
begin
if @b_list is not NULL
begin
insert #lists values (@id_old, @b_list)
end
select @id_old = @id,
@b_list = NULL
end
select @b_list = @b_list + case when @b_list is not NULL then '|' end + @b
fetch mycur into @id, @b
end
-- save last @id/@b_list pair
if @b_list is not NULL
begin
insert #lists values (@id, @b_list)
end
close mycur
deallocate cursor mycur
go
显示结果:
select * from #lists
go
id b_list
------- ------------
233.263 AAAAAQ|DDDD
233.283 22223|333333
ASE不提供列表()/ GROUP_CONCAT()功能所以你必须写自己的;如果你知道你只会连接2个值,那么你可以写一个双向连接;如果你需要连接未知数的值,那么你需要编写一个游标/循环方法 – markp
你有一个例子,我怎么能在这种情况下使用游标/循环方法? – Goldbones
ASE中实际上有一种方法可以跨查询内部的结果集进行连接,但使用UPDATE语句的一个模糊方面(不更新任何数据,但使用变量)。为了使用循环或N路连接,重写查询可能更好(例如:“更易于理解和维护)。 – RobV