2011年9月13日 星期二

[Oracle] Hierarchical Queries

CONNECT BY [NOCYCLE] [condition] START WITH [condition]

(or)

START WITH [condition1] CONNECT BY [condition2]

SELECT *
FROM PERSON p
CONNECT BY  p.name = PRIOR p.ID
START WITH p.ID = 0


* CONNECT BY
  • Specifies the relationship between parent rows and child rows of the hierarchy.
  • 指定 Hierarchical Queries 中 parent rows and child rows 之間的關係,當前資料會與對應的 parent rows 做比較。
  • One expression in condition must be qualified with the PRIOR operator to refer to the parent row
  • condition 中必須有一個 PRIOR,且不能包含子查詢。
  • CONNECT_BY_ISLEAF


* START WITH
  • Specifies the root row(s) of the hierarchy.
  • 指定 Hierarchical Queries 的 root (一筆或多筆),所有滿足 condition 的會被當作是 root rows。
  • 可以省略,但若沒有指定給 root,則所有資料都會被當成 root,分別掃瞄。
  • condition 可以是一個子查詢。


* PRIOR
  • 指定 parent rows。
  • Is most commonly used when comparing column values with the equality operator.
  • ex: p.name = PRIOR p.ID,表示 id of prior row = name of current name。
  • prior 放在子節點端,表示是以 START WITH 指定的節點做為跟節點,由上往下掃瞄,可能對一個或多個分支。
  • prior 放在父節點端,表示是以 START WITH 指定的節點做為最低層子節點,從下往上掃瞄,直到根節點為只,這種情況只能得到一個分支。


* LEVEL
  • Level of root row is 1,所以其 child rows 的 LEVEL = 2。


* SQL 執行順序
  1. JOIN,無論是 JOIN ON 還是在 WHERE 中做的關連
  2. CONNECT BY
  3. 其它的WHERE條件



* Reference
- Oracle Connect By
- The Oracle PL/SQL PRIOR Operator
- Hierarchical Queries
- 【原】Oracle开发专题之:级联查询(Hierarchical Queries) - pengpenglin - BlogJava
- Oracle Handbook系列之一:结构化查询(Hierarchical Queries) - SnowToday - 博客园
- oracle树中prior的用法 - space6212的个人空间 - ITPUB个人空间 - powered by X-Space

沒有留言:

張貼留言