oracle 列转行-很慢-优化--ok

本文对比了原始SQL查询的低效性,展示了如何通过使用`REGEXP_SUBSTR`和连接by技术,将大量数据中的订单ID按行拆分,提高查询性能。优化后的代码利用了distinct和子查询,使得处理大体积数据变得更快。
摘要由CSDN通过智能技术生成

将一行数据变为多行,例如:

原始写法,效率很低,特别是数据量稍微大点时基本就跑不出来了

SELECT REGEXP_SUBSTR(A.ORDERID,'[^,]+', 1, LEVEL) AS ORDERID
FROM
        (
                SELECT  ORDERID
                FROM    orders
                WHERE   INSTR(ORDERID,',')>0
                        AND BILLTYPE      =1004
                        AND NVL(STATUS,0) =0
                        AND PERMIT        =1
        )
A CONNECT BY REGEXP_SUBSTR(A.ORDERID, '[^,]+', 1, LEVEL) IS NOT NULL

ORDERID
--------------------------------------------------------------------------------
89970,89962
90154,90145
90186,90187

优化后的写法

select distinct regexp_substr(t1.ORDERID, '[^,]+', 1, level) as ORDERID
from (SELECT id,ORDERID
      FROM orders
      WHERE INSTR(ORDERID,',')>0
        AND BILLTYPE      =1004
        AND NVL(STATUS,0) =0
        AND PERMIT        =1
    ) t1
connect by t1.ID = prior t1.ID
and prior dbms_random.value is not null
and level <= length(t1.ORDERID) - length(regexp_replace(t1.ORDERID, ',', '')) + 1 ;

ORDERID
--------------------------------------------------------------------------------
89962
89970
90145
90154
90186
90187


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值