【層次查詢】Hierarchical Queries之尋根問祖(CONNECT_BY_ROOT一元運算子)

secooler發表於2010-01-02
有關層次查詢之前的文章參考如下。
【層次查詢】Hierarchical Queries之“樹的遍歷”
http://space.itpub.net/519536/viewspace-623809
【層次查詢】Hierarchical Queries之LEVEL應用
http://space.itpub.net/519536/viewspace-623916
【層次查詢】Hierarchical Queries之CONNECT_BY_ISCYCLE偽列
http://space.itpub.net/519536/viewspace-624032
【層次查詢】Hierarchical Queries之CONNECT_BY_ISLEAF偽列
http://space.itpub.net/519536/viewspace-624075
【層次查詢】Hierarchical Queries之SYS_CONNECT_BY_PATH函式
http://space.itpub.net/519536/viewspace-624099

CONNECT_BY_ROOT這個一元運算子只能在層次查詢中使用,功能很簡單,可以得到每個分支的根節點資訊。
記住,既然是一元運算子,那麼這個運算子後面一定要有“運算內容”。

1.回望關係“樹”
      A
     / \
    B   C
   /   /
  D   E
 / \
F   G

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偽列和SYS_CONNECT_BY_PATH函式看一下CONNECT_BY_ROOT對X列運算後的結果
sec@ora10g> col tree for a16
sec@ora10g> col tree_path for a16
sec@ora10g> select lpad(' ',level-1)||x tree, SYS_CONNECT_BY_PATH(x,'/') tree_path,CONNECT_BY_ROOT x from t connect by prior y=z;

TREE             TREE_PATH        CONNECT_BY
---------------- ---------------- ----------
B                /B               B
 D               /B/D             B
  F              /B/D/F           B
  G              /B/D/G           B
C                /C               C
 E               /C/E             C
D                /D               D
 F               /D/F             D
 G               /D/G             D
E                /E               E
F                /F               F
G                /G               G
A                /A               A
 B               /A/B             A
  D              /A/B/D           A
   F             /A/B/D/F         A
   G             /A/B/D/G         A
 C               /A/C             A
  E              /A/C/E           A

19 rows selected.

是不是有一種“尋根問祖”的韻味在裡邊。在遍歷的過程中每一個子樹根節點的X列資訊都被清晰的得到了。

4.為了更加明顯的體現出CONNECT_BY_ROOT是一個一元運算子,我們可以將上面的“CONNECT_BY_ROOT x”改寫成為“CONNECT_BY_ROOT(x)”。
sec@ora10g> select lpad(' ',level-1)||x tree, SYS_CONNECT_BY_PATH(x,'/') tree_path,CONNECT_BY_ROOT(x) from t connect by prior y=z;

TREE             TREE_PATH        CONNECT_BY
---------------- ---------------- ----------
B                /B               B
 D               /B/D             B
  F              /B/D/F           B
  G              /B/D/G           B
C                /C               C
 E               /C/E             C
D                /D               D
 F               /D/F             D
 G               /D/G             D
E                /E               E
F                /F               F
G                /G               G
A                /A               A
 B               /A/B             A
  D              /A/B/D           A
   F             /A/B/D/F         A
   G             /A/B/D/G         A
 C               /A/C             A
  E              /A/C/E           A

19 rows selected.

5.小結
在複雜的層次查詢中一切可以確定資料根源的資訊都是值得推崇的,CONNECT_BY_ROOT這個一元運算子便是其中之一。

Good luck.

secooler
10.01.02

-- The End --

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-624114/,如需轉載,請註明出處,否則將追究法律責任。

相關文章