2017-06-30 81 views
0

這個問題有一定的關係,我剛纔的問題: Oracle SQL Connect By Logic甲骨文的CONNECT BY

表:

create table temp (emp_id varchar2(3), manager_id varchar2(3)) 

數據:

E10 E20 
E20 E50 
E30 E50 
E40 E40 
E50 E90 
E90 E90 

我想創建一個查詢中使用連接通過上鍊查找父 - 母記錄而不是獲取子記錄。

解決辦法:

Select EMP_ID 
from temp 
    Start with EMP_ID = 'E20' 
    Connect by NOCYCLE EMP_ID = Prior MANAGER_ID 
order by EMP_ID 

但是按我的要求,我需要獲取所有家長&上述查詢停在E90。 [可能是因爲NOCYCLE,因爲E90上的經理是一樣的]。

查詢輸出:

E20 
E50 

所需的輸出:

E20 
E50 
E90 

請指教。

回答

1

似乎循環是問題。

通過使用CONNECT BY子句中的PRIOR運算符查看列來檢測週期。

要打破這種循環,您需要添加平凡真實的條件,但在其他列上使用PRIOR運算符。

例如:你的CONNECT BY子句中,添加

and prior emp_id is not null 

(假設EMP_ID不能爲null)。

+0

我得到了你想做的事情。但是,刪除NOCYCLE會導致「ORA-01436:用戶數據中的CONNECT BY循環」錯誤,因爲這種情況下的最終父母將成爲它自己的經理。 – pOrinG

+0

@pOrinG mathguy並不要求您刪除'connect by',只需將它添加到您的連接查詢中 –

+0

謝謝,它的工作原理! @mathguy但是我還不能理解它是如何工作的。假設我的循環達到了E50-E90,它將搜索Emp_Id,其中[先前] Manager_Id = E90,即E90-E90。然後它將再次搜索Emp_Id,其中[先前] Manager_Id = E90,並且之前的emp_id應該是E90。我想我在這裏失去了一些東西。 – pOrinG