SQL计算之记录合并

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

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

   id    name

   1     a

   2     b

   3     c

   4     d

   5     e

 

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

   ids

   1,2,3

   4,3

   1,2,3

 

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

   a,b,c

   d,c
   a,b,c

 

   集算器实现代码如下:



 

   A1A2:执行SQLT1T2的数据取出。

   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只能用于T2ids无重复值时,如果有重复值结果只会保留一个,比如:“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、付费专栏及课程。

余额充值