高效SQL——合并多个字段值或多条记录

  高效SQL——从无主键表中合并字段值

以下是引用片段:
  create table #T1 
  ( 
  A varchar(10), 
  B varchar(20) 
  ) 
  insert into #T1 values ('aa','1') 
  insert into #T1 values ('aa','9a') 
  insert into #T1 values ('bb','1') 
  insert into #T1 values ('bb','10') 
  insert into #T1 values ('bb','16') 
  insert into #T1 values ('aa','16') 
  insert into #T1 values ('aa','17') 
  insert into #T1 values ('aa','30') 
  insert into #T1 values ('bb','6df') 
  insert into #T1 values ('aa','5') 
  insert into #T1 values ('aa','8') 
  insert into #T1 values ('aa','ed')

  所要的结果:

  aa 1,9a,16,17,30,5,8,ed

  bb 1,10,16,6df

  解决方法:

以下是引用片段:
  declare @c varchar(1024) 
  set @c='' 
  declare @x char(10),@y char(10) 
  set @x='' 
  set @y='' 
  select @y=@x,@x=x.a,@c=@c + (case @x when @y then ',' else ';' + x.a + ':' end) 
  +x.d from (select b as d,a from #t1) as x order by x.a 
  set @c=substring(@c,2,len(@c)-1) 
  select @c

  为什么说是高效呢?

  因为摒弃了游标和函数的途径,而采用变量的方式来保存值

  也就是说避免了游标和函数自身的缺点

  如果是简单地把字段值合并的sql语句:

  select c1||c2||c3 as name from table

  中间可以添加字符常量和数字,如

  select c1||'test'||c2||c3 as name from table

  select c1||2||c2||c3 as name from table

  如何用一条SQL语句,将多条记录(一个字段)合并为一个?

  例如:

  table字段为:tableID(nchar)

  查询结果为不确定的多条:

  tableID

  T1

  T2

  T3

  T4

  ……

  如何用一条SQL语句将这些记录合并为一个字段,值为:'T1T2T3……'

以下是引用片段:
  create table t 
  (tableid nchar(30)) 
  insert t 
  select 'T1' union all 
  select 'T2' union all 
  select 'T3' union all 
  select 'T4' union all 
  select 'T5' union all 
  select 'T6' 
  go 
  create function f_he() 
  returns @t table(col varchar(50)) 
  as 
  begin 
  declare @sql varchar(50) 
  set @sql='' 
  select @sql=@sql+ltrim(rtrim(tableid)) from t 
  insert @t values (@sql) 
  return 
  end 
  go 
  select * from t 
  select * from dbo.f_he() 
  drop function f_he 
  drop table t 
  col 
  -------------------------------------------------- 
  T1T2T3T4T5T6 
  (所影响的行数为 1 行)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值