2012-02-25 29 views
2

有人可以解釋使用nocycle並通過根分句在oracle中的分層查詢連接,當我們不使用'開始'時,我們得到行的順序是什麼,我的意思是當我們不要用「開始」,我們得到很多很多行,可以爲任何人的幫助oracle分級查詢nocycle並通過根連接

回答

6

解釋NOCYCLE和根連接(如何不同於下手?)使用簡單的表emp,謝謝如果你的數據有環(A - > B - > A - > B ...),如果您執行分層查詢,Oracle將拋出一個異常,ORA-01436: CONNECT BY loop in user data。即使存在這樣的循環,NOCYCLE也會指示Oracle返回行。

CONNECT_BY_ROOT爲您提供對根元素的訪問權限,甚至可以在查詢中查找幾個圖層。使用HR模式:

select level, employee_id, last_name, manager_id , 
connect_by_root employee_id as root_id 
from employees 
connect by prior employee_id = manager_id 
start with employee_id = 100 

    LEVEL EMPLOYEE_ID LAST_NAME     MANAGER_ID ROOT_ID 
---------- ----------- ------------------------- ---------- ---------- 
     1   100 King          100 
     2   101 Kochhar       100  100 
     3   108 Greenberg      101  100 
     4   109 Faviet       108  100 
... 

在這裏,您看到我從員工100開始找到他的員工。運營商CONNECT_BY_ROOT讓我可以訪問King的employee_id,甚至可以降低四級。起初這個操作員讓我感到非常困惑,認爲它意味着「通過根元素連接」或其他東西。可以把它看作「CONNECT BY子句的根源」。

+0

你好,非常感謝explaining..yes,但我仍然感到困惑中我們可以得到根元素「開始」條款過於不是嗎?我使用'start with employee_id = 102'進行了檢查,並認爲層次結構將以102開頭,但通過root連接將在此員工層次結構中將「100」作爲根。但是,root_id列給出了102,所以如果我們可以使用'start with'子句獲取根元素,爲什麼要使用connect_by_root。請再次向我解釋循環:(如果A是B的經理,那麼B又是A的經理,?我知道它的愚蠢,我沒有得到它,但請解釋,非常感謝您的幫助! – ratsy 2012-02-26 21:49:44

+0

開始可以讓你定義遞歸的起始條件(通過在用作遞歸起點的節點上定義一個過濾器)CONNECT_BY_ROOT允許輸出屬於起始節點的列。 – 2012-11-26 14:28:31

0

這裏是關於nocycle在查詢中的使用。

假設我們有一個簡單的表 與r1和r2列名和B 和第二行R1爲 第一行R1 = A,R2 =值= B,R 2 =一個 現在我們知道一個指到bb返回到a。 因此,有一個循環,並且如果我們寫一個分層查詢作爲

選擇R1從表名 與R1 =開始「A」 通過事先R2 = R1連接;

我們得到通過循環錯誤連接

因此使用NOCYCLE允許甲骨文給出的結果,即使存在環路。

因此查詢 從表名選擇R1 與R1 =開始 'A' 通過NOCYCLE連接之前R2 = R1;