信用门户网站建设专家评价,做网站选什么专业,长春seo,创意产品设计获奖作品一、问题
oracle 使用regexp_substrCONNECT BY LEVEL来#xff0c;根据特定字符拆分成多行。 #xff08;注意这里我的数据是每个值都有“ ; ”#xff0c;即使后面没有值#xff0c;后面也会有个“ ; ”#xff0c; 如果是正常的分隔符#xff0c;sql 需要改成” LEVEL…一、问题
oracle 使用regexp_substrCONNECT BY LEVEL来根据特定字符拆分成多行。 注意这里我的数据是每个值都有“ ; ”即使后面没有值后面也会有个“ ; ” 如果是正常的分隔符sql 需要改成” LEVEL regexp_count(name, ‘;’)1 ”
select distinct regexp_substr(name, [^;], 1, LEVEL) namefrom (select distinct namefrom table_name awhere TIME1 sysdate - 1 / 24)
CONNECT BY LEVEL regexp_count(name, ;);执行后发现特别慢查询了好几分钟没没出来。 如果单独拿select distinct name from table_name a where TIME1 sysdate - 1 / 24 查询发现挺快的。 查看下执行计划
二、解决方法
调整后。通过利用rownum 进行join sql
select distinct regexp_substr(name, [^;], 1, n) namefrom (select distinct name, regexp_count(name, ;) rnfrom table_name awhere TIME1 sysdate - 1)join (SELECT rownum n from table_name a where rownum 999)on n rn(rownum 999可以改成rownum (select max(regexp_count(name, ‘;’)) from table_name where TIME1 sysdate - 1) ) 注意 这个里table_name表的总行数需要比(select max(regexp_count(name, ‘;’)) from table_name where TIME1 sysdate - 1) 大。如果没有随便拿个比较大的表替代不可使用(SELECT LEVEL n FROM DUAL CONNECT BY LEVEL 99)替代。
执行计划 查询耗时只需要2s多
三、总结
CONNECT BY是层次查询一般用来构造树形的构造这里查询不太适用。通过rownum构造虚拟的表进行jion查询执行计划就会执行MERGE JOIN 进行关联效率将会大大提高 。