看到一個 需求 特別有意思, 區間拆分。 恰巧和前面文章 哥說的, 區間合併需求相反, 以前 做的是 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 函數 獲取 其他列數據