2012-10-05 69 views
2

連接我有一個包含一個分層元件的表事先預言

表:

 
A  B 
P1  - 
P2  P1 
C1  P2 
C2  P2 

B是一個外鍵從同一個表

該查詢來:

 
SELECT level niveau, A 
from table parent, table child 
START WITH A IN 
('P0','P1','C2') 
CONNECT BY PRIOR A= B 

結果

 
1 P1 
1 P2 
    2 C1 
    2 C2 
1 C2 

爲什麼「2 C2」會出現?

期望的結果是,儘管這不是正確的,I:

 
1 P1 
1 P2 
    2 C1 
1 C2 
+2

出現'2 C2'是因爲'C2'是'P2'的孩子。 –

回答

2

Connect by條件start with後首先計算。在你的情況下,C2既是P2的孩子,也是層次結構的根。這就是爲什麼它會在你的結果中出現兩次。

甲加入,如果存在的話,首先,進行評價,是否加入指定在 FROM子句或WHERE子句謂詞:

Oracle Documentaion

甲骨文如下處理層次查詢。

評估CONNECT BY條件。

評估任何剩餘的WHERE子句謂詞。

甲骨文然後使用從這些評估中的信息使用下列步驟來形成 層次結構:

甲骨文選擇層次的根行(S) - 的那些 滿足與狀態的開始行。

Oracle選擇每個根行的子行。每個子行必須 滿足關於根行的一個 的CONNECT BY條件的條件。

Oracle選擇連續幾代子行。 Oracle首先 選擇在步驟2中返回的行的子項,然後選擇這些子項的子項,等等。 Oracle始終通過評估與當前的 父行相關的CONNECT BY條件來選擇子項 。

如果查詢包含沒有聯接的WHERE子句,則Oracle 將刪除層次結構中不滿足WHERE子句的 條件的所有行。 Oracle對每個行分別評估 的條件,而不是刪除不滿足條件的行 中的所有子項。

Oracle按照圖9-1所示的順序返回行。在 圖中,孩子出現在他們的父母下方。對於 分層樹的解釋,

+0

你可以調整我的查詢來像想要的? – Potinos

+1

這是你的數據是不正確的,而不是你的查詢:C2,P2對應該去或被替換爲(C2,null) – ivanhoe1982

0

設置一個節點作爲根節點的意思是,它必須與一個節點上啓動,然後它會爲你工作,我有同樣的問題,我希望這可以幫助您

SELECT level niveau, A 
from table parent, table child 
START WITH A IN ='P1' 
CONNECT BY PRIOR A= B