[英]Oracle SQL Connect By Logic
當前,在我們的一種產品中,我們具有邏輯查詢,如下所示:
create table temp (emp_id varchar2(3), manager_id varchar2(3) )
資料:
E10 E20
E20 E50
E30 E50
E50 E90
查詢:
select *
from Temp
Start with EMP_ID = 'E90'
Connect by Prior EMP_ID = MANAGER_ID and EMP_ID != MANAGER_ID
order by EMP_ID
我了解查詢[&connect by]的概念,即我們需要獲取指定員工的所有子級記錄,包括當前員工記錄。 我對最后是否需要添加EMP_ID != MANAGER_ID
表示懷疑。
問題是為什么要添加它,以及在什么情況下[如果有的話]會有用。
最后一個條件不適用於您的數據,但是避免無限遞歸非常重要。
為了說明這一點,請考慮如果在表中添加另一行會發生什么情況:
E40 E40
如果以E40
而不是E90
開頭,則Oracle會陷入無EMP_ID != MANAGER_ID
條件的無限遞歸,因為E40
將連接回E40
。
請注意,編寫此查詢的更好方法是使用NOCYCLE
選項,而不是在顯式檢查中進行編碼:
SELECT *
FROM Temp
START WITH EMP_ID = 'E90'
CONNECT BY NOCYCLE PRIOR EMP_ID = MANAGER_ID
ORDER BY EMP_ID
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.