【層次查詢】Hierarchical Queries之LEVEL應用

secooler發表於2009-12-29
繼《【層次查詢】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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章