iT邦幫忙

0

oracle 語法 connect by疑問?

  • 分享至 

  • xImage

我有一個表,欄位是單號跟日期。
單號格式為:表頭字元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

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 個回答

0
WQ
iT邦新手 2 級 ‧ 2019-12-04 09:14:17
最佳解答

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
vit5015 iT邦新手 2 級 ‧ 2019-12-04 10:30:18 檢舉

感謝,但我只要跑超過一天就會跑到爆掉,只有幾百筆的資料會跑到百萬還不停就當掉了。 不知道connect by是不是有使用上的限制?

WQ iT邦新手 2 級 ‧ 2019-12-04 10:47:48 檢舉

引述以下,因為你的條件無法限制,所以它會一直匹配..(這是我有限的知識下的認為..因為我不會這樣去下SQL)

connect by [prior] id=parentid 這部分是用來指明oracle在查找數據時以怎樣的一種關係去查找;比如說查找第二層的數據時用第一層數據的id去跟表裡面記錄的parentid欄位進行匹配,如果這個條件成立那麼查找出來的數據就是第二層數據,同理查找第三層第四層…等等都是按這樣去匹配。

原文網址:https://kknews.cc/code/9oeyjlj.html

vit5015 iT邦新手 2 級 ‧ 2019-12-04 13:09:16 檢舉

感謝,是這個原因沒錯,雖然還沒看得很懂,但他例子跟我的情況一樣。我再研究看看

0
暐翰
iT邦大師 1 級 ‧ 2019-12-03 18:01:39

你的子查詢欄位是日期但是上面查詢欄位是時間,這樣會有運行錯誤
https://ithelp.ithome.com.tw/upload/images/20191203/20105988TUJA2GLWlN.png

除此之外你的思路看起來沒問題,以下測試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

https://ithelp.ithome.com.tw/upload/images/20191203/20105988H4ifbQWZKh.png

vit5015 iT邦新手 2 級 ‧ 2019-12-04 10:29:16 檢舉

感謝上面是手誤打錯,沒有錯誤訊息,只執行單天2019/11/01結果有400多筆,2019/11/02結果是100多筆。但執行兩天就會跑到爆掉,跑到百萬筆還不會停最後就當掉。 感覺是connect by 這個語法是不是我用錯了,不知道connect by到底是怎麼運行的。

我要發表回答

立即登入回答