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的記錄,遞歸執行。
如connect by level<=3,查找level<=3的記錄,因為本表所有記錄的level都是1,所以會形成:
第一層:1,2
第二層:1-1,1-2,2-1,2-2(遞歸構造第2層時,本表只有level1,滿足條件,仍然找到全部記錄)
第三層: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.構造連續的數字
select level from dual connect by level<=5;原理說明:
1.dual只有1條記錄,所以構造樹時,每層都只有1個記錄,level不會重復;
2.構造條件是:level<=5,所以截止到5。
2.構造連續的日期
由場景1的推演,可以是日期、月份等,步長也可以調整。
select sysdate+level from dual connect by level<=5;3.拆解字符串
是樹查詢與正則表達式的完美結合。
如,要把[a,b,22]按逗號拆解開。
原理說明:
1.dual只有1條記錄,所以構造樹時,每層都只有1個記錄,可能形成了包含本記錄的n次不同level的重復。
2.connect by條件:按層級截取表達不能為空,因為只有3個元素,所以只到3級。
3.正則表達式的含義:
4.拆解區間
如圖,把區間表達式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的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 局域网视频通讯-Android APP
- 下一篇: LIN总线总结