【层次查询】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 --

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/519536/viewspace-623916/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/519536/viewspace-623916/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值