Oracle中start with xx connect by prior 语句解析
? Oracle這種的start with語句主要對B型樹的數據進行遞歸查詢.可以指定數據樹上的任一節點,然后查找到它所有的子節點或者父節點.
? 現在有如下圖的數據:
我們先想數據庫插入數據,這里用到oracle的批量插入寫法
# 1 建表 CREATE TABLE START_WITH ( sub_levels VARCHAR2(255) NOT NULL , super_levels VARCHAR2(255) DEFAULT '' ?NULL ) NOCOMPRESS ; ? # 批量插入方法1 INSERT INTO START_WITH(sub_levels,super_levels) select ?'2','1' from dual union all select '3','1' from dual; ? # 批量插入方法2 INSERT ALL INTO START_WITH(sub_levels,super_levels) VALUES ('4','2') INTO START_WITH VALUES ('5','2') INTO START_WITH VALUES ('6','3') INTO START_WITH VALUES ('7','3') INTO START_WITH VALUES ('8','4') INTO START_WITH VALUES ('9','4') select 1 from dual; # 正常寫法 insert into START_WITH(sub_levels,super_levels) values ('10','8');使用start with 實例1 -->>查詢指定節點下的所有子節點
# 實例1 : 查詢指定節點下的所有子節點 select * from START_WITH start with sub_levels = '2' connect by prior sub_levels = super_levels order by super_levels,sub_levels;上面的查詢結果如下:
現在對start with的用法進行解析.
2.1 start with sub_levels = '2' 這段sql相當進行一個查詢 select * from START_WITH where sub_levels = '2' ;
我們能得到
2.2 接著看connect by prior sub_levels = super_levels 這段sql 其中的prior sub_levels 表示將2.1中結果的sub_levels作為現在的值,此時這句sql相當于
? connect by 2 = super_levels 這句sql我們可以看做是一個新的查詢
? select * from START_WITH super_levels = 2
? 我們能得到結果
? 接著程序會對我么sub_levels 為4的情況執行start with語句和connect by 語句,依次遞歸直到最后一個子級為止.
2.3 我們可以將整個查詢過程看做是如下流程
?
使用start with 實例2 : -->> 查詢指定節點下的所有父節點
# 實例2 : 查詢指定節點下的所有父節點 select * from START_WITH start with sub_levels = '8' connect by prior super_levels = sub_levels order by super_levels,sub_levels;? 結果如下:
查詢過程相當于:
其余兩查詢
select * from START_WITH start with super_levels = '2' connect by prior sub_levels = super_levels order by super_levels,sub_levels;
總結
通過上面的結果我們可以發現如下規律
a. 當在prior 后跟子級時是自上而下的查詢所有的子節點
b. 當在prior后更父級時是自下而上的查詢所有的父節點
總結
以上是生活随笔為你收集整理的Oracle中start with xx connect by prior 语句解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Jackson高级操作————节点树
- 下一篇: Web应用安全————多点登录互斥