日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Oracle connect by与level的使用

發(fā)布時間:2024/3/7 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Oracle connect by与level的使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.level是什么?

level是在樹形結構中、表示層級的偽列。

1.1樹形結構

Oracle支持樹形結構的查詢,用關鍵字connect by 表示。
connect by表示在構造樹形結構時,上下級的確定方式或者用來查找下(上)級記錄的條件,滿足這個條件就拼到結果樹里

默認是從根開始,如connect by prior id=pid,表示構造樹時,本記錄的id是下條的pid,即找pid=本條id的記錄做下條記錄。
交換prior位置,表示從葉開始。如connect by id= prior pid,表示構造樹時,本記錄的pid是下條的id。
ps:prior表示構造樹的源頭方向。

1.2 如何生成

因為level只在樹形結構中,所以level必須與connect by 結對出現。
實質是遞歸方法。

  • 有正常上下級結構
    如connect by prior id=pid,從本表查找符合pid是本條id的記錄,遞歸執(zhí)行。
  • 無上下級結構
    如connect by level<=3,查找level<=3的記錄,因為本表所有記錄的level都是1,所以會形成:
    第一層:1,2
    第二層:1-1,1-2,2-1,2-2(遞歸構造第2層時,本表只有l(wèi)evel1,滿足條件,仍然找到全部記錄)
    第三層:1-1-1,1-1-2,1-2-1,1-2-2,2-1-1,2-1-2,2-2-1,2-2-2
    構造的元素個數公式:n=個數;m=層級;=n+n2+n3+…+n^m
    如2個數、3層,構造的元素數:=2+22+223=13個;
    如6個數、2層,構造的元素數:=6+66=42個。
  • 2.使用場景

    1.構造連續(xù)的數字

    select level from dual connect by level<=5;

    原理說明:
    1.dual只有1條記錄,所以構造樹時,每層都只有1個記錄,level不會重復;
    2.構造條件是:level<=5,所以截止到5。

    2.構造連續(xù)的日期

    由場景1的推演,可以是日期、月份等,步長也可以調整。

    select sysdate+level from dual connect by level<=5;

    3.拆解字符串

    是樹查詢與正則表達式的完美結合。
    如,要把[a,b,22]按逗號拆解開。

    SELECT REGEXP_SUBSTR('a,b,22', '[^,]+', 1, LEVEL)FROM DUAL CONNECT BY REGEXP_SUBSTR('a,b,22', '[^,]+', 1, LEVEL) IS NOT NULL

    原理說明:
    1.dual只有1條記錄,所以構造樹時,每層都只有1個記錄,可能形成了包含本記錄的n次不同level的重復。
    2.connect by條件:按層級截取表達不能為空,因為只有3個元素,所以只到3級。
    3.正則表達式的含義:

  • pattern=‘[^,]+’,[]表待選集合,但以^開頭,表示非逗號的所有元素。
  • 是從左開始截取、直到遇到不符合pattern的元素
  • 4.拆解區(qū)間

    如圖,把區(qū)間表達式1-5,拆解成1,2,3,4,5。

    with temp0 as(select t.range_num,REGEXP_SUBSTR(t.range_num, '[^-]+', 1, 1) minNum, --最小numREGEXP_SUBSTR(t.range_num, '[^-]+', 1, 2) maxNum --最大numfrom (select '1-5' as range_numfrom dualunionselect '6-9' as range_numfrom dual) t)select t1.range_num, t2.lvfrom temp0 t1join (select level lvfrom dualCONNECT BY LEVEL <= (select max(maxNum) from temp0)) t2on (t2.lv >= t1.minNum and t2.lv <= t1.maxNum);


    原理說明:
    1.用正則表達式,拆解出范圍的最大、最小值。如1-5對應1,5;
    2.用connect by 構造范圍對應的集合。本例最大值是9,顧是1,2,3…9
    3.用表連接構造最終結果。連接條件:t2.lv >= t1.minNum and t2.lv <= t1.maxNum。

    總結

    以上是生活随笔為你收集整理的Oracle connect by与level的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。