Oracle 表通过某字段查询出的数据按一定规则合并后存入新表,如何提高效率。用的是java。

渝都晨雷 2017-11-15 04:07:23
A表
linkid oltid oltport basid basprot
1 001 oport1 42301 bport1
1 42301 oport2 002 bport2
2 ...
B表
linkid oltid oltport switchid switchport1 switchport2 basid basport
1 001 oport1 42301 bport1 aport2 002 bport2
2 ...
A表的数据有两千多万条,以linkid去重后仍有近千万条,目前是用java去重后分页查询存入list,然后遍历list,用linkid去A表查数据,排序后多条组合成B表的一条,然后插入到B表。此方法效率太低,5分钟才插入1万条。
求各位大大,告知更为高效的操作方式,在此谢过!
...全文
273 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
渝都晨雷 2017-11-16
  • 打赏
  • 举报
回复
感谢 碧水幽幽泉,真的有用
碧水幽幽泉 2017-11-15
  • 打赏
  • 举报
回复
上述SQL可以实现你的需求
碧水幽幽泉 2017-11-15
  • 打赏
  • 举报
回复

--1.创建测试表
create table tmp
as
select 1 seq, 1 linkid, '001' oltid, 'oport1' oltport, '42301' basid, 'bport1' basprot from dual union all
select 2 seq, 1 linkid, '42301' oltid, 'oport2' oltport, '002' basid, 'bport2' basprot from dual

--2.SQL实现
select linkid,
regexp_substr(str,'[^,]+',1,1) as oltid,
regexp_substr(str,'[^,]+',1,2) as oltport,
regexp_substr(str,'[^,]+',1,3) as switchid,
regexp_substr(str,'[^,]+',1,4) as switchport1,
regexp_substr(str,'[^,]+',1,5) as switchid2,
regexp_substr(str,'[^,]+',1,6) as switchport2,
regexp_substr(str,'[^,]+',1,7) as basid,
regexp_substr(str,'[^,]+',1,8) as basport
from(
select linkid,listagg(str,',') within group (order by seq) as str
from(select seq, linkid,oltid||','||oltport||','||basid||','||basprot as str from tmp)
group by linkid
);

渝都晨雷 2017-11-15
  • 打赏
  • 举报
回复
A表中的linkid重复的条数可能是两个,三个,四个。。。这个不是动态的,但是是不确定的,这个应该不影响组合到一起的结果。 问题中我写的是简要的示例,只要处理逻辑可行,我就能应用到更多个上去。 新的字段这都是放到B表中了,和问题上对应的一样
碧水幽幽泉 2017-11-15
  • 打赏
  • 举报
回复
同一个linkid可能会对应两个,三个,四个。。。

还是动态的? 新的字段如何命名呢?
渝都晨雷 2017-11-15
  • 打赏
  • 举报
回复
是的,同一个linkid可能会对应两个,三个,四个。。。还有个字段写漏了,linkid旁边有个seq字段,以区别同一linkid不同数据及排序。最终存入到B表的linkid只对应一条数据。
碧水幽幽泉 2017-11-15
  • 打赏
  • 举报
回复
行转列?

同一个linkid对应2条数据?

17,088

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧