【層次查詢】Hierarchical Queries之LEVEL應用
繼《【層次查詢】Hierarchical Queries之“樹的遍歷”》http://space.itpub.net/519536/viewspace-623809
文章中雖然給出了樹的遍歷方法,但是結果看上去不是很直觀。透過這個小文兒給大家介紹一下層次查詢中可用的一個偽列“LEVEL”,這個偽列可以顯示出資料的層次級別。
1.回憶一下這棵“樹”
A
/ \
B C
/ /
D E
/ \
F G
如果以A作為根節點,那麼,A就是LEVEL 1,第二行是LEVEL 2,第三行是LEVEL 3,以此類推……
2.再回憶一下刻畫這棵樹的T表資料
sec@ora10g> select * from t;
X Y Z
---------- ---------- ----------
A 1
B 2 1
C 3 1
D 4 2
E 5 3
F 6 4
G 7 4
7 rows selected.
3.直入主題,引入“LEVEL”偽列。直接可以得到每一條記錄的層次級別。
sec@ora10g> select x, y, z, level from t start with x = 'A' connect by prior y=z;
X Y Z LEVEL
---------- ---------- ---------- ----------
A 1 1
B 2 1 2
D 4 2 3
F 6 4 4
G 7 4 4
C 3 1 2
E 5 3 3
7 rows selected.
透過上面查詢,可以很清楚地知道每條記錄所處的級別,可以很直接地知到誰是您的直接Boss!
找Boss的過程:從當前記錄向上查詢,找到的第一個比自己level值小的記錄便是您的頂頭上司。
例如要得到E的頂頭上司:E的level是3,向上查詢到第一個比3小的記錄是C(C的level是2),所以C是E的直接領導。
例如要得到C的頂頭上司:C的level是2,向上查詢到第一個比2小的記錄是A(A的level是1),所以A是C的直接領導。
4.LEVEL偽列小應用其一,使用lpad函式輔助給出記錄的層次關係。
sec@ora10g> select x, y, z, level, lpad(x,level,'>') lpad from t start with x = 'A' connect by prior y=z;
X Y Z LEVEL LPAD
---------- ---------- ---------- ---------- ---------------------
A 1 1 A
B 2 1 2 >B
D 4 2 3 >>D
F 6 4 4 >>>F
G 7 4 4 >>>G
C 3 1 2 >C
E 5 3 3 >>E
7 rows selected.
不用多說,七條記錄的層次級別不言自明。
5.LEVEL偽列小應用其二,得到連續遞增的等差序列。
sec@ora10g> select level, 2*level, 3*level from dual connect by level <= 10;
LEVEL 2*LEVEL 3*LEVEL
---------- ---------- ----------
1 2 3
2 4 6
3 6 9
4 8 12
5 10 15
6 12 18
7 14 21
8 16 24
9 18 27
10 20 30
10 rows selected.
6.LEVEL偽列小應用其三,完成測試表資料的初始化。
1)建立待初始化資料的測試表T_LEVEL
sec@ora10g> create table t_level (x number, y number);
Table created.
2)使用層次查詢完成三條初始化資料的插入
sec@ora10g> insert into t_level select level, dbms_random.random from dual connect by level <= 3;
3 rows created.
sec@ora10g> commit;
Commit complete.
3)驗證初始化的三條資料
sec@ora10g> select * From t_level;
X Y
---------- ----------
1 1229751406
2 -1.937E+09
3 158774029
7.LEVEL偽列小應用其四,“乾坤大挪移”的另外一種實現方法。
sec@ora10g> col secooler for a8
sec@ora10g> select substr ('secooler', rownum, 1) "secooler" from dual connect by rownum <= length('secooler');
secooler
--------
s
e
c
o
o
l
e
r
8 rows selected.
“乾坤大挪移”初級實現請參見文章《【SQL】“乾坤大挪移”》http://space.itpub.net/519536/viewspace-622309
8.小結
本文透過幾個有趣的例子給大家簡單介紹了層次查詢中的LEVEL偽列的用法,希望對大家有幫助。
有關層次查詢的樂趣不僅限於此,更多精彩敬請期待。
Good luck.
secooler
09.12.29
-- The End --
文章中雖然給出了樹的遍歷方法,但是結果看上去不是很直觀。透過這個小文兒給大家介紹一下層次查詢中可用的一個偽列“LEVEL”,這個偽列可以顯示出資料的層次級別。
1.回憶一下這棵“樹”
A
/ \
B C
/ /
D E
/ \
F G
如果以A作為根節點,那麼,A就是LEVEL 1,第二行是LEVEL 2,第三行是LEVEL 3,以此類推……
2.再回憶一下刻畫這棵樹的T表資料
sec@ora10g> select * from t;
X Y Z
---------- ---------- ----------
A 1
B 2 1
C 3 1
D 4 2
E 5 3
F 6 4
G 7 4
7 rows selected.
3.直入主題,引入“LEVEL”偽列。直接可以得到每一條記錄的層次級別。
sec@ora10g> select x, y, z, level from t start with x = 'A' connect by prior y=z;
X Y Z LEVEL
---------- ---------- ---------- ----------
A 1 1
B 2 1 2
D 4 2 3
F 6 4 4
G 7 4 4
C 3 1 2
E 5 3 3
7 rows selected.
透過上面查詢,可以很清楚地知道每條記錄所處的級別,可以很直接地知到誰是您的直接Boss!
找Boss的過程:從當前記錄向上查詢,找到的第一個比自己level值小的記錄便是您的頂頭上司。
例如要得到E的頂頭上司:E的level是3,向上查詢到第一個比3小的記錄是C(C的level是2),所以C是E的直接領導。
例如要得到C的頂頭上司:C的level是2,向上查詢到第一個比2小的記錄是A(A的level是1),所以A是C的直接領導。
4.LEVEL偽列小應用其一,使用lpad函式輔助給出記錄的層次關係。
sec@ora10g> select x, y, z, level, lpad(x,level,'>') lpad from t start with x = 'A' connect by prior y=z;
X Y Z LEVEL LPAD
---------- ---------- ---------- ---------- ---------------------
A 1 1 A
B 2 1 2 >B
D 4 2 3 >>D
F 6 4 4 >>>F
G 7 4 4 >>>G
C 3 1 2 >C
E 5 3 3 >>E
7 rows selected.
不用多說,七條記錄的層次級別不言自明。
5.LEVEL偽列小應用其二,得到連續遞增的等差序列。
sec@ora10g> select level, 2*level, 3*level from dual connect by level <= 10;
LEVEL 2*LEVEL 3*LEVEL
---------- ---------- ----------
1 2 3
2 4 6
3 6 9
4 8 12
5 10 15
6 12 18
7 14 21
8 16 24
9 18 27
10 20 30
10 rows selected.
6.LEVEL偽列小應用其三,完成測試表資料的初始化。
1)建立待初始化資料的測試表T_LEVEL
sec@ora10g> create table t_level (x number, y number);
Table created.
2)使用層次查詢完成三條初始化資料的插入
sec@ora10g> insert into t_level select level, dbms_random.random from dual connect by level <= 3;
3 rows created.
sec@ora10g> commit;
Commit complete.
3)驗證初始化的三條資料
sec@ora10g> select * From t_level;
X Y
---------- ----------
1 1229751406
2 -1.937E+09
3 158774029
7.LEVEL偽列小應用其四,“乾坤大挪移”的另外一種實現方法。
sec@ora10g> col secooler for a8
sec@ora10g> select substr ('secooler', rownum, 1) "secooler" from dual connect by rownum <= length('secooler');
secooler
--------
s
e
c
o
o
l
e
r
8 rows selected.
“乾坤大挪移”初級實現請參見文章《【SQL】“乾坤大挪移”》http://space.itpub.net/519536/viewspace-622309
8.小結
本文透過幾個有趣的例子給大家簡單介紹了層次查詢中的LEVEL偽列的用法,希望對大家有幫助。
有關層次查詢的樂趣不僅限於此,更多精彩敬請期待。
Good luck.
secooler
09.12.29
-- The End --
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-623916/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 0629_層次查詢
- es筆記五之term-level的查詢操作筆記
- FFmpeg應用實踐之命令查詢
- springboot應用查詢城市天氣Spring Boot
- [譯] SQLite 底層查詢原理SQLite
- SAP RETAIL 根據Merchandise Category Hierarchy Level查詢物料清單AIGo
- pgsql查詢優化之模糊查詢SQL優化
- 記錄一次遞迴查詢的運用遞迴
- 零售資料分析之操作篇12:子查詢的應用
- 分頁查詢及其擴充應用案例
- 透過遞迴查詢應用依賴遞迴
- 通過bundle Id查詢應用資訊
- 記一次kafka的high level和low levelKafka
- MySQL之連線查詢和子查詢MySql
- DS靜態查詢之順序查詢
- 層級查詢並將層級拆分成多列
- MySQL與PHP的基礎與應用專題之資料查詢SRBFMySqlPHP
- mysql常見的查詢語句的應用MySql
- elasticsearch之exists查詢Elasticsearch
- JavaScript之DOM查詢JavaScript
- jQuery之元素查詢jQuery
- Java | 頂層類(Top-Level Class)Java
- SQL 查詢 exist join in 的用法和相應的適用場景 (最佳化查詢)SQL
- 造輪子之單層應用總結篇
- 分層資料 Hierarchical Data 探索 (2.鄰接表模型)模型
- Alluxio Local Cache 加速 Presto 查詢在 Uber 的應用UXREST
- 順序表應用6:有序順序表查詢
- 【機器學習】--層次聚類從初識到應用機器學習聚類
- Mysql之查詢語句MySql
- Java API之查詢文件JavaAPI
- Linux系列之查詢命令Linux
- prometheus之查詢語言Prometheus
- 資料探勘之 層次聚類聚類
- Mybatis底層原理學習(二):從原始碼角度分析一次查詢操作過程MyBatis原始碼
- 前15天查詢次數曲線
- 巢狀關聯會查詢兩次巢狀
- oracle資料庫sql查詢檢視第二次查詢很慢Oracle資料庫SQL
- 來聊聊 應用層
- 應用層協議協議