【層次查詢】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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- [轉]Hierarchical Queries之LEVEL應用
- 【層次查詢】Hierarchical Queries之“樹的遍歷”
- 【層次查詢】Hierarchical Queries之處理順序
- 【層次查詢】Hierarchical Queries之CONNECT_BY_ISCYCLE偽列
- 【層次查詢】Hierarchical Queries之CONNECT_BY_ISLEAF偽列
- 【層次查詢】Hierarchical Queries之SYS_CONNECT_BY_PATH函式函式
- 【層次查詢】Hierarchical Queries之親兄弟間的排序(ORDER SIBLINGS BY)排序
- 【層次查詢】Hierarchical Queries之尋根問祖(CONNECT_BY_ROOT一元運算子)
- Hierarchical Queries 級聯查詢(樹狀結構查詢)
- informix 中層次/樹型/Hierarchical查詢的使用ORM
- Oracle層次化查詢Oracle
- 0629_層次查詢
- 【SQL 學習】層次化查詢之CONNECT BY 和 START WITHSQL
- Oracle層次查詢和分析函式在號段選取中的應用Oracle函式
- Oracle層次查詢和分析函式在號段選取中的應用(轉)Oracle函式
- FFmpeg應用實踐之命令查詢
- es筆記五之term-level的查詢操作筆記
- 字串查詢之字元次數字串字元
- 資料庫開發基礎--層次查詢+資料庫
- 資料庫開發基礎---層次查詢資料庫
- Media Queries媒體查詢常用關鍵詞
- 【--SQL基礎-->層次化查詢(START BY ... CONNECT BY PRIOR)】SQL
- 查詢EBS應用版本
- 查詢與插入資料使用rownum與level
- 在Oracle層次查詢中給SIBLINGS排序Oracle排序
- SQL解析過程中的查詢轉換 - Transforming QueriesSQLORM
- 查詢之折半查詢
- Oracle層次查詢中connect_by_iscycle偽列的取值研究Oracle
- sql之22 Hierarchical RetrievalSQL
- 【機器學習】--層次聚類從初識到應用機器學習聚類
- select查詢之五:分析函式在查詢的運用函式
- [譯] SQLite 底層查詢原理SQLite
- 保險業高速發展期 應推動多層次CRM應用
- 列車車次查詢-餘票查詢-Api介面API
- 【SQL查詢】集合查詢之INTERSECTSQL
- 機器學習 之 層次聚類機器學習聚類
- 通過bundle Id查詢應用資訊
- 記錄一次遞迴查詢的運用遞迴