当前位置: 代码迷 >> SQL >> SQL计算之记要合并
  详细解决方案

SQL计算之记要合并

热度:79   发布时间:2016-05-05 10:18:02.0
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 ).[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只能用于T2ids无重复值时,如果有重复值结果只会保留一个,比如:“2,1,2,3”算完的结果是”a,b,c”而不是”b,a,b,c”,相对来讲,集算器的语法要更直观易懂且适用面更广

?

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

  相关解决方案