我有一個表,欄位是單號跟日期。
單號格式為:表頭字元3碼-日期6碼+流水號4碼 ex.AAA-1912030001
其中的資料會有缺號的問題,像是AAA-1912030001~AAA-1912030010
中間會少AAA-1912030008
我想用語法去列出某段區間全部表的單號,想法是查出最大單號跟最小單號,再使用connect by去迴圈增加流水號後列出來,再用這個全查出來的表跟會缺號的表做比對。
下面是簡化過的語法,跑下面這段的時候如果日期用單日都可以正常跑完,但用到二天以上就會跑不完。請問是哪裡出問題?
SELECT substr(B.MIN,11,4)+(LEVEL-1) as everylist,時間
from (select max(單號) as MAX,日期,min(單號) as MIN
from 單號TABLE
where 日期 BETWEEN '01-11-2019 00:00:00' AND '02-11-2019 00:00:00'
group by 日期 ) B
CONNECT BY LEVEL < substr(MAX,11,4)-substr(MIN,11,4)+2
where 日期 BETWEEN '01-11-2019 00:00:00' AND '02-11-2019 00:00:00'
上述這句在我的工具是跑不動的,所以我就劃蛇添足..加了to_date...
我想樓主應該是在稽核ERP的表單有沒有..........題外話...直接上CODE...
記得再排序一下日期,就可以了(<==應該吧)~
SELECT distinct day(日期),B.MAX_d,B.MIN_d,substr(B.MIN_d,11,4)+(LEVEL-1) as everylist
from (select max(單據) as MAX_d,日期,min(單據) as MIN_d from 表格
where 日期 BETWEEN to_date('2019-06-01','yyyy/mm/dd') AND to_date('2019-06-03','yyyy/mm/dd')
and 單據 like '單別%'--單別有點多,所以先限定
group by 日期 ) B where 日期 = to_date('20'||substr(MAX_d,5,6),'yyyy/mm/dd')
CONNECT BY LEVEL < substr(MAX_d,11,4)-substr(MIN_d,11,4)+2
感謝,但我只要跑超過一天就會跑到爆掉,只有幾百筆的資料會跑到百萬還不停就當掉了。 不知道connect by是不是有使用上的限制?
引述以下,因為你的條件無法限制,所以它會一直匹配..(這是我有限的知識下的認為..因為我不會這樣去下SQL)
connect by [prior] id=parentid 這部分是用來指明oracle在查找數據時以怎樣的一種關係去查找;比如說查找第二層的數據時用第一層數據的id去跟表裡面記錄的parentid欄位進行匹配,如果這個條件成立那麼查找出來的數據就是第二層數據,同理查找第三層第四層…等等都是按這樣去匹配。
原文網址:https://kknews.cc/code/9oeyjlj.html
感謝,是這個原因沒錯,雖然還沒看得很懂,但他例子跟我的情況一樣。我再研究看看
你的子查詢欄位是日期
但是上面查詢欄位是時間
,這樣會有運行錯誤
除此之外你的思路看起來沒問題,以下測試Script :
有甚麼錯誤訊息嗎?
with 單號TABLE as (
select 'AAA-1912030001' 單號 from dual union all
select 'AAA-1912030010' from dual
)
SELECT substr(B.MIN,11,4)+(LEVEL-1) as everylist
, substr(MAX,11,4)
from (
select max(單號) as MAX,min(單號) as MIN
from 單號TABLE
) B
CONNECT BY LEVEL < substr(MAX,11,4)-substr(MIN,11,4)+2