? ?问题来源: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 ).[email protected]())
?
?????? 用SQL实现这个问题需要用到子查询生成一个唯一分组号,再用较复杂的JOIN实现,以MySQL为例写成这样:
? ? ? ?select group_concat(t1.name) names from(
????????????? select @row:[email protected]+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形式的计算结果,具体方法可参考相关文档。