ITPub博客

首页 > Linux操作系统 > Linux操作系统 > [转]Hierarchical Queries之LEVEL应用

[转]Hierarchical Queries之LEVEL应用

原创 Linux操作系统 作者:leonarding 时间:2012-02-24 07:01:33 0 删除 编辑
文章中虽然给出了树的遍历方法,但是结果看上去不是很直观。通过这个小文儿给大家介绍一下层次查询中可用的一个伪列“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> colsecoolerfor 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伪列的用法,希望对大家有帮助。

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

请登录后发表评论 登录
全部评论
刘盛,网名leonarding,the first ACEA in china, Oracle OCM10g&11g RHCE, ACOUG Core Member Blogger, DATAGURU Oracle数据库版主, ITPUB HADOOP版版主, DB2中国专家组成员, 专注于&Oracle&Hadoop&Nosql&SAS, 提倡“分享技术~成就梦想”, 新浪微博:@itpub_leonarding QQ:40354446

注册时间:2012-02-10

  • 博文量
    246
  • 访问量
    3231807