继《【层次查询】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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/519536/viewspace-623916/