一张 邮件信息表 (截取关键字段) 
  标题 收件人
  XXX zhangsan;lisi;wangwu;
  XXX2 zhaoliu;momo;
  ... ...
一张 联系人表 (截取关键字段) 
  用户名 用户真实姓名
  zhangsan 张三
  lisi 李四
  ... ...希望得到 一个邮件列表 在web中显示
  标题 收件人
  XXX zhangsan(张三);lisi(李四);wangwu(王五);
  XXX2 zhaoliu(张柳);momo;
  ... ...要求:由于是列表,从性能上考虑,不希望每条记录都另做处理,希望用一条sql就能查询到这个列表,各位有什么好的想法吗?包括数据库设计方面的更改,hibernite方面都可以修改。
  

解决方案 »

  1.   

    这个问题就是行转列,列再转行
    select bb.a,
           replace(wm_concat(aa.用户名 || decode(aa.真实姓名, '', '', '(' || aa.真实姓名 || ')')),
                   ',',
                   ';') || ';'
      from (SELECT 标题, REGEXP_SUBSTR(收件人, '[^;]+', 1, l) AS b
              FROM 邮件信息表, (SELECT LEVEL l FROM DUAL CONNECT BY LEVEL <= 30)
             WHERE l <= LENGTH(收件人) - LENGTH(REPLACE(收件人, ';')) + 1) bb,
           联系人表 aa
     where aa.用户名 = bb.b
     group by bb.a