集算器实现记录合并

   问题来源:http://bbs.csdn.net/topics/390991336

  表1(T1)中存储了单独的id和name字段,部分源数据如下:

  id    name

  1     a

  2     b

  3     c

  4     d

  5     e 

  表2(T2)中存储了多个id组成的ids字段,其值如下:

  ids

  1,2,3

  4,3

  1,2,3

  现在要根据T1中的id和name,将T2中的ids转化为对应的多个name组成的记录,比如上述T2转换后的结果为:

  a,b,c
  d,c
  a,b,c
  集算器实现代码如下:

   A1,A2:执行SQL将T1、T2的数据取出。

   A3:循环A2中的记录,将每个ids值转为序列后,与T1中的记录匹配得到name序列,而后转换为逗号分隔的记录。结果如下:

     上述写法要假定id为整数且连续,如果id不连续,那么A3的写法可以改为:

         A3>A1.primary(id)

        A4=A2.(ids.array().(A1.find(~).name ).string@d())

 

       用SQL实现这个问题需要用到子查询生成一个唯一分组号,再用较复杂的JOIN实现,以MySQL为例写成这样:

select group_concat(t1.name) names from(
select @row:=@row+1 as gid,ids from t2,(SELECT @row :=0 ) r
) t2 left join t1 on find_in_set(t1.id,t2.ids) group by t2.gid

         而且,这个SQL只能用于T2的ids无重复值时,如果有重复值结果只会保留一个,比如:“2,1,2,3”算完的结果是”a,b,c”而不是”b,a,b,c”,相对来讲,集算器的语法要更直观易懂且适用面更广

 

   集算器可被报表工具或java程序调用,调用的方法也和普通数据库相似,使用它提供的JDBC接口即可向java主程序返回ResultSet形式的计算结果,具体方法可参考相关文档。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值