oracle的拆分组合查询

表:msg_content

表:msg_contact_person


想要得到的效果


要点分析:结果表和表1不同的地方是receiver字段加入了表2的真实姓名

实现方式:

   第一步:拆分表1的字段

                SELECT c.msg_content_id AS contentId,
                                       REGEXP_SUBSTR(receiver, '[^;]+', 1, l) AS b
                                  FROM msg_content c,
                                       (SELECT LEVEL l
                                          FROM DUAL
                                        CONNECT BY LEVEL <= 30)
                                 WHERE l <= LENGTH(receiver) -
                                       LENGTH(REPLACE(receiver, ';')) + 1

              得到结果集:

     

第二步:与表2左连接:

     select bb.contentId, bb.b, dd.user_real_name
                          from (SELECT c.msg_content_id AS contentId,
                                       REGEXP_SUBSTR(receiver, '[^;]+', 1, l) AS b
                                  FROM msg_content c,
                                       (SELECT LEVEL l
                                          FROM DUAL
                                        CONNECT BY LEVEL <= 30)
                                 WHERE l <= LENGTH(receiver) -
                                       LENGTH(REPLACE(receiver, ';')) + 1) bb
                          left join msg_contact_person dd on bb.b = dd.account_name
                         where bb.b is not null

结果集:

第四步:用wm_concat进行字符的组合,并且加入分页  OK完成

select *
  from (select dd.msg_content_id,
               dd.account_name,
               cc.receiver,
               dd.sender,
               dd.realname,
               dd.title,
               dd.content,
               dd.send_time,
               dd.if_del,
               dd.msg_lv
          from msg_content dd,
               (select jj.contentId,
                       replace(wm_concat(jj.b ||
                                         decode(jj.user_real_name,
                                                '',
                                                '',
                                                '(' || jj.user_real_name || ')')),
                               ',',
                               ';') || ';' receiver
                  from (select bb.contentId, bb.b, dd.user_real_name
                          from (SELECT c.msg_content_id AS contentId,
                                       REGEXP_SUBSTR(receiver, '[^;]+', 1, l) AS b
                                  FROM msg_content c,
                                       (SELECT LEVEL l
                                          FROM DUAL
                                        CONNECT BY LEVEL <= 30)
                                 WHERE l <= LENGTH(receiver) -
                                       LENGTH(REPLACE(receiver, ';')) + 1) bb
                          left join msg_contact_person dd on bb.b = dd.account_name
                         where bb.b is not null) jj
                 group by jj.contentId) cc
         where dd.msg_content_id = cc.contentId
         order by dd.msg_content_id desc)
 where rownum <= 10




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值