看到一个 需求 特别有意思, 区间拆分。 恰巧和前面文章 哥说的, 区间合并需求相反, 以前 做的是 1-10, 11- 20 合并成 1-20 。
现在这个 需求相反 是 1-10, 拆分成 1,2,3,4,5,6,7,8,9,10 . 我的SQL语句中大多是查询 数据, 现在是 在查找到的数据范围中, 生成对应数据。
如图:
--问题1.表结构和数据如下:
--帐号 支票本编号 支票号范围
--AC_NO CHQ_ID CHQ_RANGE
--601001 1 100-150
--601001 2 200-300
--要求结果显示如下:
--AC_NO CHQ_ID CHQ_NUMBER
--601001 1 100
--601001 1 101
--601001 1 150
--601001 2 200
--601001 2 201
--。。。。
--601001 2 300
with tab1 as(
select 601001 AC_NO, 1 CHQ_ID, '10-15' CHQ_NUMBER from dual
union all
select 601002 AC_NO, 2 CHQ_ID, '20-30' CHQ_NUMBER from dual
),
tab2 as(select tab1.*, to_number( regexp_substr(CHQ_NUMBER, '[^-]+',1, 1)) re1, to_number(regexp_substr(CHQ_NUMBER, '[^-]+',1, 2)) re12
from tab1
)select ac_no,chq_id, re1+level-1,chq_number from tab2
connect by level <=re12-re1+1 and prior ac_no = ac_no
and ( prior dbms_random.value() ) is not null ;
Ora-01436 :用户数据中的connect by 循环 ----》 proir dbma_random.value();
今天 这道题目 哥想到另外一种解发, 效率上面可能存在问题。
解法: 查询出 最大, 最小值, 以及最值之间的 差异,
然后 运用 connect by 生成 数据, 最后用外连接 获取数据, 外连接上面 再用 lag 或者 lead 函数 获取 其他列数据