oracle中行转列并排序与oracle查询优化

本文介绍了在Oracle数据库中如何将逗号分隔的行数据转换为列并排序,以及查询优化策略,如使用exist替代in提升效率,利用listagg函数进行列转行查询,同时强调了listagg在性能和排序上的优势。此外,还提到了添加索引对查询性能的影响。
摘要由CSDN通过智能技术生成

1,oracle中行转列并排序

with a as (select 'ABC,AA,AD' id,'X' AS Name from dual
union ALL select 'ABC,AA,AD,ABD,JI,CC,ALSKD,ALDKDJ' id,'Y' AS NAme from dual)
select a.NAME,case 
when length(regexp_replace(id,'[^,]+')) IS null then a.id 
when b.NUM = 1   then SUBSTR(a.ID,0,instr(a.ID , ',' ,'1','1')-1) 
when b.NUM = length(regexp_replace(id,'[^,]+')) + 1  then 
SUBSTR(a.ID,instr(a.ID , ',' ,'1',b.NUM-1)+1)
else
SUBSTR(a.ID, instr(a.ID , ',' ,1,b.NUM-1)+1, instr(a.ID , ',' ,1,b.NUM) - instr(a.ID , ',' ,1,b.NUM - 1) - 1)
end as x
from a
join (select  1+(rownum - 1) num  from  dual connect by rownum <= 1000) b on b.NUM <= nvl(length(regexp_replace(id,'[^,]+')),0) + 1 order by a.NAME,b.num
sql解释:

with a as (select 'ABC,AA,AD' id,'X' AS Name from dual
union ALL select 'ABC,AA,AD,ABD,JI,CC,ALSKD,ALDKDJ' id,'Y' AS NAme from dual)

定义一个a的表:name是X,Y,对应的列id是用逗号拼接起来的数据

要转化为,id,name一一对应

select a.NAME,case 
when length(regexp_replace(id,'[^,]+')) IS null then a.id 
when b.NUM = 1   then SUBSTR(a.ID,0,instr(a.ID , ',' ,'1','1')-1) 
when b.NUM = length(regexp_replace(id,'[^,]+')) + 1  then 
SUBSTR(a.ID,instr(a.ID , ',' ,'1',b.NUM-1)+1)
else
SUBSTR(a.ID, instr(a.ID , ',' ,1,b.NUM-1)+1, instr(a.ID , ',' ,1,b.NUM) - instr(a.ID , ',' ,1,b.NUM - 1) - 1)
end as x
from a
join (select  1+(rownum - 1) num  from  dual connect by rownum <= 1000) b on b.NUM <= nvl(length(regexp_replace(id,'[^,]+')),0) + 1 order by a.NAME,b.num

这段sql是查询a表,根据逗号分割的数量来分割数据,查询成name,id一一对应的格式。

2,oracle查询优化

1)查询表连接速度:表连接>exist>not exist>in>not in;
因此如果简单提高效率可以用exist代替in进行操作,当然换成表连接可以更快地提高效率,具体是用left join代替not in 和
not exist,用inner ioin 代替in和exist,这样可以大大提高效率。

就是将in的表关联,然后根据关联的表的id是否为null去实现in和not in等

2)列传行查询:listagg>WM_CONCAT

listagg可以排序,而且查询效率高,WM_CONCAT有的版本已经不支持了

listagg查询实例:select listagg(TO_CHAR(USERID)) within group(order by ID),name from forp_text group by name

forp_text:表名;

id:主键id

USERID:人员id

name:分组字段

3)添加索引等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值